id | age | birthday | name |
---|---|---|---|
1 | 18 | 01-01 | User1 |
2 | 19 | 03-01 | User2 |
3 | 20 | 03-01 | User3 |
4 | 21 | 03-01 | User4 |
5 | 22 | 05-01 | User5 |
6 | 18 | 06-01 | User6 |
7 | 24 | 01-01 | User7 |
創(chuàng)建一個聯(lián)合索引(age, birthday),并查詢出年齡>20,且生日為03-01的用戶:
select * from user where age>20 and birthday="03-01"
由于age字段使用了范圍查詢,根據(jù)最左前綴原則,這種情況只能使用age字段進行范圍查詢,索引中的birthday字段無法使用。使用explain查看執(zhí)行計劃:
+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | 1 | SIMPLE | user | range | age_birthday | age_birthday | 4 | NULL | 3 | Using index condition | +------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
可以看到雖然使用了age_birthday索引,但是索引長度key_len只有4,說明只有聯(lián)合索引只有age字段生效了(因為age字段是int類型,占用4個字節(jié))。最后Extra列的Using index condition表示這個查詢使用了索引下推優(yōu)化。
為在沒有索引下推的情況下,執(zhí)行步驟如下:
如果開啟了索引下推優(yōu)化,執(zhí)行步驟如下:
啟用索引下推后,把where條件由MySQL服務層放到了存儲引擎層去執(zhí)行,帶來的好處就是存儲引擎根據(jù)id到表格中讀取數(shù)據(jù)的次數(shù)變少了。在上面這個例子中,沒有索引下推時需要多回表查詢2次。并且回表查詢很可能是離散IO,在某些情況下,對數(shù)據(jù)庫性能會有較大提升。
到此這篇關于MySQL索引下推(ICP)的簡單理解與示例的文章就介紹到這了,更多相關MySQL索引下推(ICP)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!