高效能MySQL-特定類型查詢的最佳化詳解

黄舟
發布: 2017-03-15 17:23:48
原創
1665 人瀏覽過


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

count查詢最佳化

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

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

對於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操作中表達式只涉及到一個表格中的欄位。這樣MySQL就可能使用索引最佳化

子查詢

盡量少用子查詢,因為子查詢會產生臨時表;除非像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筆記錄。代價很高,這種時候優化最簡單方法就是使用覆蓋索引。

以上是高效能MySQL-特定類型查詢的最佳化詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!