優化Innodb儲存引擎

2021-07-11 12:58:08 字數 3692 閱讀 2146

優化innodb表的儲存布局

一旦資料達到了穩定的狀態,或是增加到了很大的情況下,就要考慮使用optimize table 語句來重新組織表,壓縮浪費的空間,重新組織的錶能占用更少的空間,有更好的全表掃瞄效能,當索引或調整應用的**效果都不明顯的時候,這是乙個很直接的辦法。

optimize table拷貝部分表的資料重建索引,主要是減少表空間中的碎片和索引中資料的壓縮,具體的好處取決於每個表中的資料,可能有些能獲取很大的提公升,有的不能,如果表很大那麼這個操作可能會很慢,或正在重建的索引不再bufferpool,第一次載入大量資料後,可能會執行很慢。

在innodba中,有個長的主鍵,會浪費很多的空間,在所有的二級索引記錄中主鍵值都是被複製的指向同乙個記錄,如果有個很長的主鍵就考慮建立乙個自增的主鍵。

使用varchar而不是char來儲存字元變數,char是固定長度的,可能會浪費空間

對很大的表或是很多的text或numeric的列,考慮使用compressed行格式。

優化innodb的事務管理

預設的mysql使用autocommit=1,這樣在繁忙的系統是不是很好,好的做法是將朵兒dml放在乙個事務中,oracle的那種處理方式。如果事務修改了資料,那麼在每次提交的時候,innodb都會重新整理日誌到磁碟上,每次修改都提交,那麼對於io的吞吐會有限制。

如果事務都是select的語句,那麼autocommit會識別唯讀事務優化他們。

在插入,更新,刪除大量的資料後避免rollback,在乙個很慢的系統上,做這個操作只會更壞,回滾可能會花費原dml語句幾倍的時間去執行,殺掉資料庫的程序不會有幫助,伺服器在啟動的時候會自動回滾。

一旦出現了回滾,為了加快操作,可以加大buffer pool,或是殺掉server,然後使用innodb_force_recovery=3啟動伺服器。

如果能夠承受丟失最近一次提交的資料,可以設定innodb_flush_log_at_trx_commit=0,這樣每一秒會重新整理下日誌,但是重新整理是沒***的,同時設定innodba_support_xa=0,會減少因為同步二進位制日誌和磁碟資料的重新整理次數。

當行被修改或被刪除後,行及相關的undo日誌不會馬上被物理刪除,即使事務提交結束後也不會馬上刪除,類似oracle的多版本管理。

當乙個長時間執行的事務修改了表,對這個表進行的查詢不會使用轉換索引技術,通常查詢可以在二級索引中獲取資料,兒不會查詢表。如果二級索引頁上發現了乙個page_max_trx_id太新了,或是二級索引上的資料被標記成被刪除的狀態,innodb也許會使用聚簇索引來查詢記錄。

優化innodb唯讀事務

mysq5.6.4中,innodb對於唯讀的事務不會 事務id,對於寫操作,鎖讀,或select..for update會有事務id,這樣減小了內部資料結構的大小。

當事務以start transaction_read_only開始的時候就是唯讀的事務,在這個事務中是不能對資料做修改的,但是對於會話級別的臨時表可以修改,或是加鎖,因為這些改變對於別的會話都是不可見的。

優化innodb redo

確保redo日誌檔案很大,跟buffer pool一樣大,redo 日誌檔案的大小和數量是由innodb_log_file_size和innodb_log_file_in_group來控制的。

考慮增大log_buffer,大的log_buffer能讓大的事務在提交前不必寫日誌到磁碟上,所以系統上有很多的插入刪除,更新等操作,需要設定大的log buffer,它的大小是由innodb_log_buffer_size控制的。

對innodb表的批量資料載入

當匯入資料的時候,關閉autocommit。

如果在二級鍵上有唯一約束,那麼在載入資料的時候,臨時禁用set unique_checks=0;

如果有外來鍵約束,在載入資料的時候禁用set foreign_key_checks=0

使用多行的insert語句來減少客戶端與伺服器端的互動

當載入資料到包含auto-increment欄位的表時,設定innodb_autoinc_lock_mode=2

優化innodb查詢

對每列不要建立分開的二級索引

當列不含空值得時候,要宣告成not null

如果對乙個不經常更新的表有很多重複的查詢,可以啟用查詢快取,相當於oracle的結果集快取

query_cache_type=1

query_cache_size=10m

優化innodb的磁碟io

設定innodb_buffer_pool_size,通常這個值設定成物理記憶體的80%

如果因為checkpoin的操作導致了效能下降,考慮增加innodb_io_capacity的值。

其他io相關的引數

innodb_adaptive_flushing,

innodb_change_buffer_max_size,

innodb_change_buffering,

innodb_flush_neighbors,

innodb_log_buffer_size,

innodb_log_file_size,

innodb_lru_scan_depth,

innodb_max_dirty_pages_pct,

innodb_max_purge_lag

innodb_open_files,

innodb_page_size,

innodb_random_read_ahead,

innodb_read_ahead_threshold,

innodb_read_io_threads,

innodb_rollback_segments,

innodb_write_io_threads, and

sync_binlog.

優化有很多表的系統

innodb在系統啟動後第一次訪問表的時候計算索引的行值,而不是將它儲存在表中,對於將資料分割槽到很多表的系統可能會花費很長的時間,為了後面使用表,可以先用下面的語句預熱下select 1 from tab_nmae limit 1;

優化innodb配置引數

可以配置的有下面的幾點

1讓innodb使用高效能記憶體分配器

2控制dml型別操作來決定哪個innodb的快取來放改變的資料避免頻繁的小磁碟寫,預設的是快取所有的dml操作。跟oracle的keep池等概念一樣

3開啟自適應hash索引,使用innodb_adaptive_hash_index

4設定併發執行緒

5控制預讀的數量,在負載高的系統上,太多的預讀會導致系統間隙性效能下降

6增加讀寫後台程序 數量

7控制後台io執行緒數量

8控制後台寫的演算法

9利用多核處理器,和快取配置來減少上下文切換

10調整日誌檔案設定

11控制buffer pool的大小和數量

12增加最大併發事務的數量

13減少在併發執行緒間的轉換,設定innodb_thread_concurrency=32,innodb_concurrency_tickets=5000,這樣可以讓執行緒在被交換出去之前完成後面的工作,避免上下文的切換。

InnoDB 儲存引擎

innodb是事務型資料庫的首選引擎,支援事務安全表 acid 支援行鎖定和外來鍵。mysql 5.5.5 之後,innodb作為預設儲存引擎。innodb的主要特性有一下幾項。a.innodb給mysql提供了具有提交 回滾和崩潰恢復能力的事務安全 acid相容 儲存引擎。innodb鎖定在行級並...

InnoDB 儲存引擎

設計上採用了類似於oracle資料庫的架構 接下來 詳細介紹 innodb 儲存引擎的 體系架構 及其不同於其他儲存引擎的特性 一 概述 innodb 儲存引擎 是第乙個完整支援acid事物的 mysql 儲存引擎 特點 1 行鎖設計 2 支援mvcc 3 提供一致性非鎖定讀 4 最有效地利用 以及...

InnoDB儲存引擎

內外存交換的基本單位 mysql將資料從外存讀入記憶體不是以記錄為單位,這樣消耗太大,是以頁為單位,每個頁裡填充記錄。每頁大小為16kb。記錄堆 行記錄儲存區,分為有效記錄和已刪除記錄兩種 自由空間鍊錶 已刪除記錄組成的鍊錶 未分配空間 頁尾 儲存頁面校驗資訊 頁內的資料是按照主鍵的順序有序儲存的。...