日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效

發布時間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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也会使用索引?使用这俩关键字的时候索引什么时间会失效的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。