order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效
目錄
寫在前面
初始化語句
order?by索引分析
總結
group?by
寫在前面
? ? 我們都知道,索引可以提高查詢和排序的速度。
? ? 所以,order?by做排序的時候,顯然是可以使用索引的。
? ? group?by做分組也會用到索引嗎?
關于查詢時索引失效場景的驗證,請參考這篇文章:MySQL索引失效的場景,什么情況下會造成MySQL索引失效
初始化語句
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20),`age` int(11),`address` varchar(25),`crtdate` timestamp,PRIMARY KEY (`id`) USING BTREE );insert into student(name,age,address,crtdate) values('張三', 15, '山東青島', now()); insert into student(name,age,address,crtdate) values('李四', 17, '山東濟南', now()); insert into student(name,age,address,crtdate) values('王五', 18, '山東濰坊', now());-- 創建復合索引 alter table student add index idx_stu_nameAgeAddr(name,age,address);order?by索引分析
MySQL支持兩種方式排序,fileSort和index,index效率高,fileSort效率低。
order?排序同樣也適用于查詢的那些索引規則。
name用于查詢,age用于查詢和排序,遵循最左前綴原則,所以查詢和排序都用到了索引:
age是范圍查詢,所以address失效了,排序就使用filesort方式:
只用到了age,復合索引開頭的name沒使用,所以age失效,排序沒走索引:
查詢用到age,排序用到address,沒用到索引開頭的name,所以查詢和排序都失效:
正常走索引,但是如果有升序有降序,就會導致索引失效:
總結
假設建立索引key a_b_c(a,b,c)
order by 能使用最左前綴原則(以下四種情況索引生效):
- order by a
- order by a,b
- order by a,b,c
- order by a desc,b desc,c desc
如果where+order by符合最左前綴原則,則索引生效
- where a=1 order by b,c
- where a=1 and b=2 order by c
- where a=1 and b>2 order b,c
以下情況索引失效:
- order by a asc,b desc,c desc // 排序不一致
- where d=1 order by b,c //丟失a索引
- where a=1 order c // 丟失b索引
- where a>1 order b,c // 范圍之后失效
group?by
group?by實際是先進行排序,再進行分組。所以遵循order?by的索引機制。
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql什么时候用in,什么时候用ex
- 下一篇: 2019建中台,2020拆中台,为什么很