程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL之Covering Index

MySQL之Covering Index

編輯:關於MYSQL數據庫
-在網上隨便搜搜,就能找到大把的關於MySQL優化的文章,不過裡面很多都不准確,說個常見的:

SELECT a FROM ... WHERE b = ...

一般來說,很多文章會告誡你類似這樣的查詢,不要在“a”字段上建立索引,而應該在“b”上建立索引。這樣做確實不錯,但是很多時候這並不是最佳結果。為什麼這樣說?讓我們先來分析一下查詢的處理過程:在執行查詢時,系統會查詢“b”索引進行定位,然後再利用此定位去表裡查詢需要的數據“a”。也就是說,在這個過程中存在兩次查詢,一次是查詢索引,另一次是查詢表。那有沒有辦法用一次查詢搞定問題呢?有,就是Covering Index!具體到此例中就是建立一個復合索引“b, a”,當查詢進行時,通過復合索引的“b”部分去定位,至於需要的數據“a”,立刻就可以在索引裡得到,從而省略了表查詢的過程。

如果你想利用Covering Index,那麼就要注意SELECT方式,只SElECT必要的字段,千萬別SELECT *,因為我們不太可能把所有的字段一起做索引,雖然可以那樣做,但那樣會讓索引文件過大,結果反倒會弄巧成拙。

如何才能確認查詢使用了Covering Index呢?很簡單,使用explain即可!只要在Extra裡出現Using index就說明使用的是Covering Index。

知道了以上這些知識,估計對Coverging Index的了解也差不多了。再舉兩個例子,讓大家印象深點:

(一)比如說在文章系統裡統計總數的時候,一般的查詢是這樣的:

SELECT COUNT(*) FROM articles WHERE category_id = ...

當我們在category_id建立索引後,這個查詢使用的就是Covering Index。

(二)比如說在文章系統裡分頁顯示的時候,一般的查詢是這樣的:

SELECT id, title, content FROM articles ORDER BY created DESC LIMIT 10000, 10;

通常這樣的查詢會把索引建在created字段(其中id是主鍵),不過當LIMIT偏移很大時,查詢效率仍然很低,改變一下查詢:

SELECT id, title, content FROM articles
INNER JOIN (
SELECT id FROM articles ORDER BY created DESC LIMIT 10000, 10
) AS page USING(id)
ORDER BY created DESC

此時,建立復合索引"created, id"就可以在子查詢裡利用上Covering Index,快速定位id,查詢效率嗷嗷的。

Covering Index並不是什麼很難的概念,但是人們往往會忽視它的價值,希望本文能給你提個醒。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved