深入MySQL優化 索引優化

2021-09-11 08:38:45 字數 1679 閱讀 4945

#查詢category_id為1且comments大於1的情況下,views最多的article_id

explain

select id,author_id

from article

where category_id=

1and comments>

1order

by views

limit

1;

explain:

type為all

extra:using filesort ;using where

初步優化

#為category_id,comments,views欄位建立復合索引

create

index idx_ccv on article(category_id,comments,views)

;

explain:

type從all變為range,但是extra仍然有using filesort。可是我們已經建立索引了,為什麼還會進行檔案排序。

我們對查詢語句進行修改:

explain

select id,author_id

from article

where category_id=

1and comments=

1//將》1改為=1

order

by views

limit

1;

explain:

我們可以發現type從range變為了ref,而且extra沒有了using filesort。其實這兩者的變化涉及到了索引失效的知識點。因為索引失效,才導致了file sort。

索引失效

按照btree索引的工作原理,

#先排序category_id,再排序comments,如果遇到相同的comments,再排序views(就類似於上樓梯,需要1樓1樓按順序往上爬一樣)

#因comments>1條件是乙個範圍值(所謂range)

#mysql無法再利用索引對後面的views部門進行檢索,即range型別查詢字段後面的索引失效

二次優化

因為comments是乙個範圍,不適合建立索引,我們直接對category_id和views建立索引就好。

create

index idx_cv on article(category_id,views)

;

explain:

這樣就成功實現了優化。

兩表聯合時會有左外連線,以及右外連線。當為左外連線時,由於左表一定會全部匯入,所以只需要關心右表,將索引新增到右表即可;右外連線也是同樣道理。

小結join語句的優化,

索引是二叉樹,大於、小於、等於可以使用到二叉樹機制,但是!=沒辦法應用二叉樹機制

select ename from t_emp where deptno!=20; #不使用索引

select ename from t_emp where deptno<20 and deptno>20;

深入MySQL優化 索引失效

最佳左字首法則 所謂的最佳左字首法則就是查詢時使用到的字段順序需要滿足建立索引時的字段順序。看下面的栗子 在staffs表上,建立 name,age.pos 的索引 可以看到在index表上,name,age,pos的seq in indexx是按照建立索引時的順序從小到大的,即name age p...

mysql 深入優化 Mysql的深入優化

ok,廢話不多說,上乾貨。調優思路 0.硬體優化 1.資料庫設計與規劃 以後再修改很麻煩,估計資料量,使用什麼儲存引擎 2.資料的應用 怎樣取資料,sql 語句的優化 3.磁碟 io 優化 4.mysql 服務優化 記憶體的使用,磁碟的使用 5.my.cnf 內引數的優化。0.硬體優化 cpu 64...

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...