Mysql查詢優化最常見方法是索引
一. 索引
對於不同的MySql存儲引擎,索引實現細節不同,這裏不展開了。
1).索引的優缺點
優點: 可以在查詢時避免全表掃描,加快查詢速度。不僅可以加快單表查詢速度,對多表查詢加速更加明顯
缺點: 索引佔物理空間,降低了大部分與寫入有關的操作速度(因爲寫入操作要相應修改索引)
2).索引的選取
- 爲用於搜索,分組,排序的列創建索引(即最佳候選索引選取列位於where字句中的列,連接子句中的列,出現在order by,group by子句中的列)
- 考慮數據列的基數。 相對於表裏的總行數來說,列的基數越大(該列包含的唯一值多,重複值少),在該列創建索引效果越好。
- 索引短小值(索引儘量選取較小的數據類型)。短小值在如下幾個方面提高索引檢索性能: a. 讓比較操作更快;b. 讓索引短小,減少磁盤IO請求;c. 對於短小的鍵值,鍵緩存裏的索引塊可以容納更多的鍵值,也能減少IO請求次數。
- 不要建立過多索引
- 利用最左前綴。
- 索引字符串值得前綴
- 讓參加匹配得索引類型保持匹配
二. 選擇有利於高效查詢的數據類型
- 多用數字少用字符串運算
- 當較小數據類型夠用時就不用較大數據類型
- 把數據列聲明成not null
- 考慮使用 ENUM 列
- 整理表碎片。 碎片是有害的,會造成磁盤存儲空間浪費。適用於各種存儲引擎的碎片整理方法是:先用mysqldump轉儲表,然後再利用這個轉儲文件重建它。
例如:
mysqldump db_name table_name > dump.sql
mysql db_name < dump.sql
- 把數據壓縮到ELOB或TEXT列
7)使用合成索引
8)儘量避免檢索很大的ELOB或TEXT列
三. 選擇有利於高效查詢的表格式
四. 高效加載數據
1)LOAD DATA 效率比 INSERT高
2)當必須用 INSERT 時,如果有多條插入語句,可以使用如下方式優化:
a) 對於支持事務的存儲引擎,可以在單個事務裏執行這些SQL語句
start transiction;
insert into .......;
insert into .......;
...
insert into .......;
commit;
b) 對於不支持事務的存儲引擎,可以先佔用對錶的寫入鎖,在表被鎖定時執行insert語句。
lock tables table_name write;
insert into .......;
insert into .......;
...
insert into .......;
unlock tables;
以上兩種方式只有在所有的sql語句執行完後纔會刷新索引,而不是每個insert執行完後刷新一次,這樣性能就提升了。
五. 調度,鎖定和併發
Mysql的調度策略總結如下:
a) 寫入優先級比讀取高
b) 表的寫入操作一次只能進行一個,多個寫入操作按其到達的先後次序依次處理
c) 讀取操作可以同時進行
InnoDB採用行級鎖實現這種策略,但只在必要時候纔會鎖定行。