MySQL儲存引擎InnoDB的配置與使用的講解
阿新 • • 發佈:2020-01-09
MyISAM和InnoDB是MySQL最常有的儲存引擎,上一篇我們講述了InnoDB與MyISAM之間的區別;由於MyISAM不支援事務,當我們需要使用一個健壯的事務型儲存引擎的時候,InnoDB必然是最好的選擇。
innodb 通過多版本併發控制(MVCC)來獲得高併發性,並且實現了SQL標準的4種隔離級別,預設為REPEATABLE
級別。同時,使用一種被稱為next-key locking
的策略來避免幻讀(phantom
)現象的產生。除此之外,InnoDB儲存引擎還提供了插入緩衝(insert buffer
)、二次讀寫(double write
)、自適應雜湊索引(adaptive hash index
read ahead
)等高效能和高可用的功能。
如何設定InnoDB為預設引擎:
- 1. 檢視mysql儲存引擎情況: mysql>show engines。 InnoDB | YES,說明此mysql資料庫伺服器支援InnoDB引擎。
- 2. 設定InnoDB為預設引擎:在配置檔案my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
- 3. 重啟mysql伺服器
- 4. 登入mysql資料庫,mysql>show engines。如果出現 InnoDB |DEFAULT,則表示設定InnoDB為預設引擎成功。
InnoDB常用配置引數:
#InnoDB儲存資料字典、內部資料結構的緩衝池,16MB 已經足夠大了。 innodb_additional_mem_pool_size = 16M #InnoDB用於快取資料、索引、鎖、插入緩衝、資料字典等 #如果是專用的DB伺服器,且以InnoDB引擎為主的場景,通常可設定實體記憶體的50% #如果是非專用DB伺服器,可以先嚐試設定成記憶體的1/4,如果有問題再調整 #預設值是8M,非常坑X,這也是導致很多人覺得InnoDB不如MyISAM好用的緣故 innodb_buffer_pool_size = 4G #InnoDB共享表空間初始化大小,預設是 10MB,也非常坑X,改成 1GB,並且自動擴充套件 innodb_data_file_path = ibdata1:1G:autoextend #如果不瞭解本選項,建議設定為1,能較好保護資料可靠性,對效能有一定影響,但可控 innodb_flush_log_at_trx_commit = 1 #InnoDB的log buffer,通常設定為 64MB 就足夠了 innodb_log_buffer_size = 64M #InnoDB redo log大小,通常設定256MB 就足夠了 innodb_log_file_size = 256M #InnoDB redo log檔案組,通常設定為 2 就足夠了 innodb_log_files_in_group = 2 #啟用InnoDB的獨立表空間模式,便於管理 innodb_file_per_table = 1 #啟用InnoDB的status file,便於管理員檢視以及監控等 innodb_status_file = 1 #設定事務隔離級別為 READ-COMMITED,提高事務效率,通常都滿足事務一致性要求 transaction_isolation = READ-COMMITTED 其他配置選項也需要注意: #設定最大併發連線數,如果前端程式是PHP,可適當加大,但不可過大 #如果前端程式採用連線池,可適當調小,避免連線數過大 max_connections = 60 #最大連線錯誤次數,可適當加大,防止頻繁連線錯誤後,前端host被mysql拒絕掉 max_connect_errors = 100000 #設定慢查詢閥值,建議設定最小的 1 秒 long_query_time = 1 #設定臨時表最大值,這是每次連線都會分配,不宜設定過大 max_heap_table_size 和 tmp_table_size 要設定一樣大 max_heap_table_size = 96M tmp_table_size = 96M #每個連線都會分配的一些排序、連線等緩衝,一般設定為 2MB 就足夠了 sort_buffer_size = 2M join_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 2M #建議關閉query cache,有些時候對效能反而是一種損害 query_cache_size = 0 #如果是以InnoDB引擎為主的DB,專用於MyISAM引擎的 key_buffer_size 可以設定較小,8MB 已足夠 #如果是以MyISAM引擎為主,可設定較大,但不能超過4G #在這裡,強烈建議不使用MyISAM引擎,預設都是用InnoDB引擎 key_buffer_size = 8M #設定連線超時閥值,如果前端程式採用短連線,建議縮短這2個值 #如果前端程式採用長連線,可直接註釋掉這兩個選項,是用預設配置(8小時) interactive_timeout = 120 wait_timeout = 120
幾個關於InnoDB引擎資料表設計相關的建議:
- 1. 所有InnoDB資料表都建立一個和業務無關的自增數字型作為主鍵,對保證效能很有幫助;
- 2. 杜絕使用text/blob,確實需要使用的,儘可能拆分出去成一個獨立的表;
- 3. 時間戳建議使用 TIMESTAMP 型別儲存;
- 4. IPV4 地址建議用 INT UNSIGNED 型別儲存;
- 5. 性別等非是即非的邏輯,建議採用 TINYINT 儲存,而不是 CHAR(1);
- 6. 儲存較長文字內容時,建議採用JSON/BSON格式儲存;
InnoDB鎖型別
InnoDB儲存引擎實現如下兩種標準的行級鎖
- 共享鎖(S Lock),允許事務讀一行資料
- 排他鎖(X Lock),允許事務刪除或更新一行資料
共享鎖和排他鎖的相容
注意:
(1)S鎖和X鎖都是行鎖,相容是指對同一記錄(row)鎖的相容性.
(2)事務T1已經獲得行R的共享鎖,另一個事務T2可以立即獲得行R的共享鎖,這種情況稱為鎖相容。事務T3想獲得行R的排他鎖,則必須等待事務T1、T2釋放行R上的共享鎖,這種情況成為鎖的不相容.
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結