高性能MySQL-特定類型查詢的優化詳解

這一節主要是對于一些特定類型的優化查詢: ?(1)count查詢優化; ?(2)關聯查詢 ?(3)子查詢 ?(4)GROUP BY 和 DISTINCT優化 ?(5)LIMIT 分頁優化

count查詢優化

count()聚合函數的作用:
(1)統計某一個列值的數量,也可以統計行數。需要注意的是統計列值時要求列值是非空的(不統計null)

(2)統計結果集的行數。當列值不可能為空時統計的就是表的行數。但是為了確保一定要使用COUNT()獲取結果集的行數。null會直接忽略所有列值直接計算行數,進行優化。

對于MyISAM存儲引擎,當在單表中沒有限定where查詢條件時COUNT(*)是非常快的,因為MyISAM本身已經存了這個行數總值。當存在where限定條件,也是需要進行查詢統計的。

下面給出一個簡單優化的使用示例:
(1)優化一:

高性能MySQL-特定類型查詢的優化詳解

可知如果我們直接查 id>100 的記錄,涉及到的有兩千多萬行記錄掃描。但是由于COUNT()特性,我們可以用 count() – (id

(2)優化二:
此外除了還有一種優化方法就是利用覆蓋索引了。

關聯查詢優化

(1)確保ON 或則USING 子句的列上有索引。創建索引時就要考慮關聯的順序,當表A和表B用列c關聯的時候,如果優化器關聯順序是B、A,就只需要在表A上建立索引。沒用的索引會占用存儲

(2)確保任何Group by 和 order by操作中null只涉及到一個表中的列。這樣null就可能使用索引優化

子查詢

盡量少用子查詢,因為子查詢會產生臨時表;除非像count(*)臨時表很小的。

GROUP BY 和 DISTINCT優化

GROUP BY 和 DISTINCT的優化最有效的就是使用索引。

當無法使用索引時,group by使用兩種策略完成:臨時表或則文件排序來做分組。

所有對于分組的列一定要建立索引。比如:

select?product,?count(*)?from?orders?group?by?product;

這樣的一個查詢,對product要建立索引。

LIMIT分頁優化

進行分頁操作時,通常都會通過偏移量來查詢某些數據。然后再加上解釋的order by,性能一般都不錯。

對于order by的列 一定要加上索引。

但是對于limit 10000, 10 這樣檢索目標10條記錄必須先先查詢前面的10000條記錄。代價很高,這種時候優化最簡單辦法就是使用覆蓋索引。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享