12、MySQL中經常使用的SQL優化 - 系統的擼一遍MySQL

插入優化

MyISAM批量導入

非空的表導入的時候會同時處理索引,致使導入效率低下,因此經過如下方式能夠快速導入。sql

//關閉非惟一索引
ALTER TABLE table_name DISABLE KEYS;
load data infile 'path' in to table table_name;
//開啓非惟一索引
ALTER TABLE table_name ENABLE KEYS;

InnoDB批量導入

一、按主鍵順序導入,InnoDB的數據按主鍵排列的B+Tree結構,因此數據按主鍵排序能夠提高效率。優化

二、關閉惟一性校驗spa

//關閉惟一校驗
SET UNIQUE_CHECKS=0;
load data infile 'path' in to table table_name;
//開啓惟一校驗
SET UNIQUE_CHECKS=1;

三、關閉自動提交線程

//關閉自動提交
SET AUTOCOMMIT=0;
load data infile 'path' in to table table_name;
//提交數據
COMMIT;
//開啓自動提交
SET AUTOCOMMIT=1;

INSERT優化

一、合併多條INSERT語句,減小客戶端與MySQL的通信次數,減小SQL解析次數。code

二、採用 INSERT DELAYED當即執行SQL語句(在內存中,以後寫入到硬盤)。排序

三、表分區、獨立表空間,將數據分佈在不一樣硬盤提升IO吞吐量。索引

查詢優化

ORDER BY語句

兩種排序方式

排序工做若是查詢的數據在索引中,能夠直接經過索引返回數據(using index),不然進行filesort。內存

filesort會在每一個線程的 sort_buffer_size規定的排序區進行排序,若是超過size大小,會在硬盤進行歸併排序。it

兩種filesort排序方式

一、兩次排序table

讀取排序字段和條件字段在sort_buffer中進行排序,若是超過大小會在硬盤中排序。排序完成後讀取硬盤數據。這種方式節省內存,可是可能形成大量IO。

二、一次掃描

一次去處全部知足條件的字段,而後在sort_buffer中排序,排序後直接返回。這種方式效率高可是消耗內存比較大,容易致使大量swap。

MySQL經過 max_length_for_sort_data來決定使用哪種方式進行排序。

排序優化方式

一、儘可能使用索引進行排序,同時減小排序返回的字段

二、根據實際狀況權衡後,調整sort_buffer的大小

三、經過調整排序字段順序,充分利用索引排序。

四、適當的limit語句來避免全表掃描。

GROUP BY 語句

group by默認會對分組字段進行排序,因此使用 order by null能夠減小排序損耗。

上圖中第二個語句沒有了filesort。

子查詢

使用 join 來代替字查詢。

能夠看到rows減小了很是多。

索引控制

//建議使用索引
SELECT * FROM user use index(索引名);
//忽略某個索引
SELECT * FROM user ignore index(索引名);
//強制使用索引
SELECT * FROM user force index(索引名);
相關文章
相關標籤/搜索