Mysql查詢優化

Mysql查詢優化最常見方法是索引
一. 索引
對於不同的MySql存儲引擎,索引實現細節不同,這裏不展開了。
1).索引的優缺點
優點: 可以在查詢時避免全表掃描,加快查詢速度。不僅可以加快單表查詢速度,對多表查詢加速更加明顯
缺點: 索引佔物理空間,降低了大部分與寫入有關的操作速度(因爲寫入操作要相應修改索引)
2).索引的選取

  1. 爲用於搜索,分組,排序的列創建索引(即最佳候選索引選取列位於where字句中的列,連接子句中的列,出現在order by,group by子句中的列)
  2. 考慮數據列的基數。 相對於表裏的總行數來說,列的基數越大(該列包含的唯一值多,重複值少),在該列創建索引效果越好。
  3. 索引短小值(索引儘量選取較小的數據類型)。短小值在如下幾個方面提高索引檢索性能: a. 讓比較操作更快;b. 讓索引短小,減少磁盤IO請求;c. 對於短小的鍵值,鍵緩存裏的索引塊可以容納更多的鍵值,也能減少IO請求次數。
  4. 不要建立過多索引
  5. 利用最左前綴
  6. 索引字符串值得前綴
  7. 讓參加匹配得索引類型保持匹配
    二. 選擇有利於高效查詢的數據類型
  1. 多用數字少用字符串運算
  2. 當較小數據類型夠用時就不用較大數據類型
  3. 把數據列聲明成not null
  4. 考慮使用 ENUM
  5. 整理表碎片。 碎片是有害的,會造成磁盤存儲空間浪費。適用於各種存儲引擎的碎片整理方法是:先用mysqldump轉儲表,然後再利用這個轉儲文件重建它。
    例如:
mysqldump db_name  table_name >  dump.sql
mysql db_name <  dump.sql
  1. 把數據壓縮到ELOBTEXT
    7)使用合成索引
    8)儘量避免檢索很大的ELOBTEXT
    三. 選擇有利於高效查詢的表格式
    四. 高效加載數據
    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採用行級鎖實現這種策略,但只在必要時候纔會鎖定行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章