什么是Mysql索引最左匹配原則?
最左匹配原則是指,在復合索引中,查詢條件需要從左到右和索引開始依次完全匹配的時候,復合索引才可以被有效使用。因為聯合索引在建立b+樹的過程中是根據索引的順序從左到右進行排序的,所以使用的時候需要遵循這個原則。
能否舉例說明復合索引在查詢時遵循最左匹配原則的情況
假設有(name,age,city)這個復合索引,那么查詢語句就得是:
SELECT * FROM users WHERE name = 'Alice' AND age = 30;
?才可以有效使用復合索引。
不過以下的查詢雖然沒有符合最左匹配原則但是也可以有效使用到復合索引,這是因為mysql有個優化器會調整順序。
SELECT * FROM users WHERE age = 30 AND name = 'Alice';
?當遇到范圍查詢(> ;<)的時候 會停止匹配。舉個例子:
有聯合索引(a,b,c)
where a>1, b=2, c=3; 因為a往后遍歷,b,c的順序在b+樹的位置是無序的,無法充分使用聯合索引。(但是這里會觸發mysql5.6以后版本的一個功能:索引下推。下文中有提到,還是這個例子)
where a>=1, b=2 ;a=1的時候,利用聯合索引快速定位到a=1,b=2這條數據,當a繼續往下遍歷的時候?無法使用b=2,而是遍歷出所有數據后再進行過濾。(同樣會觸發索引下推)
where a=1,b=1,c>3 這個查詢語句可以全部用上二級索引,因為當a=1,b=2的時候。c已經是有序的了。
?假如你有一個查詢很慢,但是你確定使用了復合索引。你會如何診斷并優化
首先來利用expiain語句來查看查詢的執行計劃,檢查是否使用了正確的索引,如果發現沒有充分利用索引,可以檢查是否存在違反最左匹配原則,調整條件的順序,減少返回的列數,使用覆蓋索引等去優化。
mysql中的覆蓋索引是什么?
覆蓋索引就是查詢的字段被全部包含在二級索引里面的情況,這個時候可以直接通過二級索引查出數據,不需要通過聚簇索引回表去查詢其他數據。
舉個例子:
假如現在有索引(name,age)
SELECT name,age?FROM users WHERE name = 'Alice' (符合覆蓋索引)
SELECT name?FROM users WHERE name = 'Alice' (符合覆蓋索引)
SELECT name,age,city?FROM users WHERE name = 'Alice' (不符合覆蓋索引,因為字段city不存在于二級索引(name,age)當中),需要回表去查詢出city。
索引下推是什么
索引下推是mysql在5.6之后的版本支持的一個功能,在使用聯合索引進行查詢后回表再對where語句過濾 變成了 直接過濾再回表。減少了回表次數。本該由serve層過濾,現在由引擎層過濾如果使用了函數,表達式,聚簇索引的情況下無法生效。
where a>1, b=2, c=3; 查詢過程中會在查詢出a>1之后把原本在server層過濾 下推到引擎層過濾再傳給server層。減少數據的傳輸量,減少回表的次數。