1. 程式人生 > 資料庫 >MySQL儲存引擎InnoDB的配置與使用的講解

MySQL儲存引擎InnoDB的配置與使用的講解

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上的共享鎖,這種情況成為鎖的不相容.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結