<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
假設有一張訂單表 order,主要包含了主鍵訂單編碼 order_no、訂單狀態 status、提交時間 create_time 等列,並且建立了 status 列索引和 create_time 列索引。此時通過建立時間降序獲取狀態為 1 的訂單編碼,以下是具體實現程式碼:
select order_no from order where status =1 order by create_time desc;
你知道其中的問題所在嗎?我們又該如何優化?
解析
status和create_time單獨建索引,在查詢時只會遍歷status索引對資料進行過濾,不會用到create_time列索引,將符合條件的資料返回到server層,在server對資料通過快排演演算法進行排序,Extra列會出現file sort;
應該利用索引的有序性,在status和create_time列建立聯合索引,這樣根據status過濾後的資料就是按照create_time排好序的,避免在server層排序
對的,為了避免檔案排序的發生。因為查詢時我們只能用到status索引,如果要對create_time進行排序,則需要使用檔案排序filesort。
filesort是通過相應的排序演演算法將取得的資料在記憶體中進行排序,如果記憶體不夠則會使用磁碟檔案作為輔助。雖然在一些場景中,filesort並不是特別消耗效能,但是我們可以避免filesort就儘量避免。
阿里巴巴MySQL規範
【推薦】 如果有 order by 的場景,請注意利用索引的有序性。 order by 最後的欄位是組合索引的一部分,並且放在索引組合順序的最後,避免出現 file_sort 的情況,影響查詢效能。
正例: where a=? and b=? order by c; 索引: a_b_c
反例: 索引如果存在範圍查詢, 那麼索引有序性無法利用,如: WHERE a>10 ORDER BY b; 索引 a_b 無 法排序
講聯合索引,一定要扯最左匹配!
最左匹配 所謂最左原則指的就是如果你的 SQL 語句中用到了聯合索引中的最左邊的索引,那麼這條 SQL 語句就可以利用這個聯合索引去進行匹配,值得注意的是,當遇到範圍查詢(>、<、between、like)就會停止匹配。 假設,我們對(a,b)欄位建立一個索引,也就是說,你where後條件為
a = 1 a = 1 and b = 2
是可以匹配索引的。但是要注意的是~你執行
b= 2 and a =1
也是能匹配到索引的,因為Mysql有優化器會自動調整a,b的順序與索引順序一致。 相反的,你執行
b = 2
就匹配不到索引了。 而你對(a,b,c,d)建立索引,where後條件為
a = 1 and b = 2 and c > 3 and d = 4
那麼,a,b,c三個欄位能用到索引,而d就匹配不到。因為遇到了範圍查詢!
如果sql為
SELECT * FROM table WHERE a = 1 and b = 2 and c = 3;
如何建立索引?
如果此題回答為對(a,b,c)建立索引,那都可以回去等通知了。
此題正確答法是,(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重點要的是將區分度高的欄位放在前面,區分度低的欄位放後面。像性別、狀態這種欄位區分度就很低,我們一般放後面。
例如假設區分度由大到小為b,a,c。那麼我們就對(b,a,c)建立索引。在執行sql的時候,優化器會 幫我們調整where後a,b,c的順序,讓我們用上索引。
阿里巴巴Java 開發手冊
【強制】 在 varchar 欄位上建立索引時,必須指定索引長度,沒必要對全欄位建立索引,根據 實際文字區分度決定索引長度。
說明: 索引的長度與區分度是一對矛盾體,一般對字串型別資料,長度為 20 的索引,區分度會高達 90%以上,可以使用 count(distinct left(列名, 索引長度))/count(*)的區分度來確定。
如果sql為
SELECT * FROM table WHERE a > 1 and b = 2;
如何建立索引?
如果此題回答為對(a,b)建立索引,那都可以回去等通知了。
此題正確答法是,對(b,a)建立索引。如果你建立的是(a,b)索引,那麼只有a欄位能用得上索引,畢竟最左匹配原則遇到範圍查詢就停止匹配。
如果對(b,a)建立索引那麼兩個欄位都能用上,優化器會幫我們調整where後a,b的順序,讓我們用上索引。
如果sql為
SELECT * FROM `table` WHERE a > 1 and b = 2 and c > 3;
如何建立索引? 此題回答也是不一定,(b,a)或者(b,c)都可以,要結合具體情況具體分析。
拓展一下
SELECT * FROM `table` WHERE a = 1 and b = 2 and c > 3;
怎麼建索引?嗯,大家一定都懂了!
SELECT * FROM `table` WHERE a = 1 ORDER BY b;
如何建立索引? 這還需要想?一看就是對(a,b)建索引,當a = 1的時候,b相對有序,可以避免再次排序! 那麼
SELECT * FROM `table` WHERE a > 1 ORDER BY b;
如何建立索引?
對(a)建立索引,因為a的值是一個範圍,這個範圍內b值是無序的,沒有必要對(a,b)建立索引。
拓展一下
SELECT * FROM `table` WHERE a = 1 AND b = 2 AND c > 3 ORDER BY c;
怎麼建索引?
SELECT * FROM `table` WHERE a IN (1,2,3) and b > 1;
如何建立索引?
還是對(a,b)建立索引,因為IN在這裡可以視為等值參照,不會中止索引匹配,所以還是(a,b)!
拓展一下
SELECT * FROM `table` WHERE a = 1 AND b IN (1,2,3) AND c > 3 ORDER BY c;
如何建立索引?此時c排序是用不到索引的。
儘可能將範圍查詢轉換成“等值”查詢,如 “a>1 and a<5 and b>10” 可以寫成“a in (1,2,3,4,5) and b > 10”,然後設定索引為 idx(a,b)。
將“等值”條件放在最左邊,按最左匹配就可以命中索引。
到此這篇關於MySQL範圍查詢優化的文章就介紹到這了,更多相關MySQL範圍查詢優化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45