非空的表導入的時候會同時處理索引,致使導入效率低下,因此經過如下方式能夠快速導入。sql
//關閉非惟一索引 ALTER TABLE table_name DISABLE KEYS; load data infile 'path' in to table table_name; //開啓非惟一索引 ALTER TABLE table_name ENABLE KEYS;
一、按主鍵順序導入,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語句,減小客戶端與MySQL的通信次數,減小SQL解析次數。code
二、採用 INSERT DELAYED當即執行SQL語句(在內存中,以後寫入到硬盤)。排序
三、表分區、獨立表空間,將數據分佈在不一樣硬盤提升IO吞吐量。索引
排序工做若是查詢的數據在索引中,能夠直接經過索引返回數據(using index),不然進行filesort。內存
filesort會在每一個線程的 sort_buffer_size規定的排序區進行排序,若是超過size大小,會在硬盤進行歸併排序。it
一、兩次排序table
讀取排序字段和條件字段在sort_buffer中進行排序,若是超過大小會在硬盤中排序。排序完成後讀取硬盤數據。這種方式節省內存,可是可能形成大量IO。
二、一次掃描
一次去處全部知足條件的字段,而後在sort_buffer中排序,排序後直接返回。這種方式效率高可是消耗內存比較大,容易致使大量swap。
MySQL經過 max_length_for_sort_data來決定使用哪種方式進行排序。
一、儘可能使用索引進行排序,同時減小排序返回的字段
二、根據實際狀況權衡後,調整sort_buffer的大小
三、經過調整排序字段順序,充分利用索引排序。
四、適當的limit語句來避免全表掃描。
group by默認會對分組字段進行排序,因此使用 order by null能夠減小排序損耗。
上圖中第二個語句沒有了filesort。
使用 join 來代替字查詢。
能夠看到rows減小了很是多。
//建議使用索引 SELECT * FROM user use index(索引名); //忽略某個索引 SELECT * FROM user ignore index(索引名); //強制使用索引 SELECT * FROM user force index(索引名);