這一節主要是對於一些特定類型的最佳化查詢:
(1)count查詢最佳化;
(2)關聯查詢
(3)子查詢
(4)GROUP BY 和 DISTINCT最佳化
(5)LIMIT 分頁最佳化
COUNT()聚合函數的作用:
(1)統計某一列值的數量,也可以統計行數。 要注意的是統計列值時要求列值是非空的(不統計NULL)
(2)統計結果集的行數。當列值不可能為空時統計的就是表的行數。但是為了確保一定要使用COUNT()來取得結果集的行數。 通配符會直接忽略所有列值直接計算行數,進行最佳化。
對於MyISAM儲存引擎,當在單一表中沒有限定where查詢條件時COUNT(*)是非常快的,因為MyISAM本身已經存了這個行數總值。當有where限定條件,也是需要進行查詢統計的。
下面給出一個簡單優化的使用範例:
(1)優化一:
可知如果我們直接查id>100 的記錄,牽涉到的有兩千多萬行記錄掃描。但由於COUNT()特性,我們可以用 count() - (id
(2)最佳化二:
此外除了還有一種最佳化方法就是利用覆蓋索引了。
(1)確保ON 或則USING 子句的欄位上有索引。建立索引時就要考慮關聯的順序,當表A和表B用列c關聯的時候,如果優化器關聯順序是B、A,就只需要在表A上建立索引。沒用的索引會佔用儲存
(2)確保任何Group by 和 order by操作中表達式只涉及到一個表格中的欄位。這樣MySQL就可能使用索引最佳化
盡量少用子查詢,因為子查詢會產生臨時表;除非像count(*)臨時表很小的。
GROUP BY 和 DISTINCT的最佳化最有效的就是使用索引。
當無法使用索引時,group by使用兩種策略完成:暫存資料表或則檔案排序來做分組。
所有對於分組的欄位一定要建立索引。例如:
select product, count(*) from orders group by product;
這樣的一個查詢,對product要建立索引。
進行分頁操作時,通常都會透過偏移量來查詢某些資料。然後再加上解釋的order by,性能一般都不錯。
對於order by的欄位 一定要加上索引。
但是對於limit 10000, 10 這樣檢索目標10筆記錄必須先查詢前面的10000筆記錄。代價很高,這種時候優化最簡單方法就是使用覆蓋索引。
以上是高效能MySQL-特定類型查詢的最佳化詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!