MySQL中復(fù)合索引和覆蓋索引的區(qū)別詳解
前言準(zhǔn)備
我們先準(zhǔn)備一張表和幾個字段,方便介紹覆蓋索引和復(fù)合索引。
創(chuàng)建一個user表,表中有id、name、school、age字段。
| 字段名 | 字段類型 |
| id | int |
| name | varchar |
| school | varchar |
| age | int |
復(fù)合索引
先來說復(fù)合索引,復(fù)合索引是一種索引,它包含多個字段,復(fù)合索引能夠使一個SQL查詢多個條件時也能走索引,提高查詢性能。
比如,創(chuàng)建一個name、school和age的復(fù)合索引:
CREATE INDEX idx_name_school_age ON user(name, school, age);
查詢SQL為:
select * from user where name = '張三' and school = '北京大學(xué)' and age > 18
注意,在這里要注意查詢條件的順序要按照復(fù)合索引的字段順序,要是不按照復(fù)合索引的順序,通常情況下是不會走索引的,因為復(fù)合索引是按照最左匹配原則,最左匹配原則的意思是查詢條件的順序要按照復(fù)合索引字段順序。
為什么要說通常情況下不走索引呢,是因為MySQL的查詢優(yōu)化器會根據(jù)條件查詢和數(shù)據(jù)分布情況選擇最優(yōu)的執(zhí)行計劃,假設(shè),我們把school和name的查詢條件到換一下,變成:
select * from user where school = '北京大學(xué)' and name = '張三' and age > 18
如果,我們條件中的school的值非常稀疏,name和age的值非常密集,那么MySQL在查詢時會認為使用索引能夠加速查詢,也會使用索引。
這里,有些同學(xué)可能會對稀疏和密集這兩個詞有些困惑,不明白這兩個詞的意思,在這里要單獨拿出來說一下,下面往user表中增加五條數(shù)據(jù),做為案例數(shù)據(jù):
| id | name | school | age |
| 1 | 張三 | 北京大學(xué) | 18 |
| 2 | 李四 | 北京大學(xué) | 18 |
| 3 | 王五 | 清華大學(xué) | 18 |
| 4 | 趙六 | 北京大學(xué) | 18 |
| 5 | 金七 | 清華大學(xué) | 18 |
稀疏的意思是每個不同的值出現(xiàn)的次數(shù)很多,比如說user表中有五條記錄,name字段分別有張三、李四、王五、趙六、金七,那么我們就可以說name這個字段非常稀疏;
那么相反,密集就好理解了,比如,user表school字段的值分別只有北京大學(xué)和清華大學(xué),那么就可以說school字段的值非常密集。
總之,MySQL的查詢優(yōu)化器會根據(jù)條件查詢和數(shù)據(jù)分布情況選擇最優(yōu)的執(zhí)行計劃,并不是說我們不按照復(fù)合索引的字段順序做查詢條件就不會走復(fù)合索引。
覆蓋索引
覆蓋索引是一種索引優(yōu)化手段,假設(shè),我們想查詢user表中name等于張三,獲取張三的school和age字段數(shù)據(jù),那么我們的SQL應(yīng)該是:
slelect school, age from user where name = '張三'
那么,為了優(yōu)化這個查詢SQL,我們就需要創(chuàng)建一個復(fù)合索引,復(fù)合索引中有name、school和age字段:
CREATE INDEX idx_name_school_age ON user(name, school, age);
當(dāng)我們查詢SQL時,MySQL就可以直接從索引中獲取所需要的數(shù)據(jù),不需要再回表查詢數(shù)據(jù)了,這樣就能大大的提高查詢速度。
在這里介紹一下回表: 假設(shè),我們創(chuàng)建一個復(fù)合索引,復(fù)合索引中有name和age字段:
CREATE INDEX idx_name_school_age ON user(name, age);
我們這里寫一個查詢SQL,SQL中查詢name等于張三的school和age字段值:
slelect school, age from user where name = '張三'
那么在查詢時,SQL語句會直接查詢索引,從索引中查詢到name叫做張三的數(shù)據(jù)位置,再根據(jù)位置去表中查詢完整的數(shù)據(jù),這里,根據(jù)位置去表中查詢完整的數(shù)據(jù)叫做回表。
總結(jié)
覆蓋索引和復(fù)合索引的區(qū)別是:覆蓋索引是一種索引優(yōu)化技術(shù),而復(fù)合索引是一種索引。
使用復(fù)合索引時應(yīng)該注意查詢SQL條件的順序,以及要避免回表,從而影響到查詢效率。
到此這篇關(guān)于MySQL中復(fù)合索引和覆蓋索引的區(qū)別詳解的文章就介紹到這了,更多相關(guān)MySQL復(fù)合索引和覆蓋索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫查詢優(yōu)化 mysql效率
MySQL由于它本身的小巧和操作的高效, 在數(shù)據(jù)庫應(yīng)用中越來越多的被采用.我在開發(fā)一個P2P應(yīng)用的時候曾經(jīng)使用MySQL來保存P2P節(jié)點,由于P2P的應(yīng)用中,結(jié)點數(shù)動輒上萬個,而且節(jié)點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試. 1. 使用statement進行綁定查詢 2. 隨機的獲取記錄 3. 使用連接池管理連接.2008-01-01
MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
MyFlash 是由美團點評公司技術(shù)工程部開發(fā)并維護的一個開源工具,主要用于MySQL數(shù)據(jù)庫的DML操作的回滾,MyFlash的優(yōu)勢在于它提供了更多的過濾選項,使得回滾操作變得更加容易,本文將實驗通過 MyFlash 工具快速恢復(fù)誤刪除 或 誤修改的數(shù)據(jù),需要的朋友可以參考下2024-06-06
MySQL性能優(yōu)化之全文檢索查詢優(yōu)化實踐
當(dāng)內(nèi)容量達到數(shù)十萬甚至數(shù)百萬條記錄時,簡單的全文檢索實現(xiàn)可能導(dǎo)致響應(yīng)時間延長等問題,下面小編就來和大家講講MySQL如何進行全文檢索查詢優(yōu)化吧2025-07-07

