国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

明明加了索引,為什么查詢還是慢?

原創
運維 數據庫運維
小李今天剛上班就收到客戶的反饋,說查詢用戶信息會非常的慢,有時甚至會出現超時的現象。

【51CTO.com原創稿件】小李今天剛上班就收到客戶的反饋,說查詢用戶信息會非常的慢,有時甚至會出現超時的現象。

[[349161]]

圖片來自 Pexels 

小李這就納悶了分明已經給表加上了索引為什么還這么慢呢。小李分析了好久都沒分析出原因,于是只能找到同部門的掃地僧大林子。

大林子一邊聽著小李的描述一邊看著項目,就在小李剛把問題描述完大林子就對小李說:“問題解決了”,小李震驚不已,問道:“這么 6,是什么原因導致的呢?分明我已經加了索引了啊?”

大林子說:“這是很多開發人員很容易忽視的問題......”聽完大林子的講解小李瞬間茅塞頓開。那么具體什么原因呢,下面我就給大家講解一下。

原因講解

首先,我們來創建一個存儲引擎為 InnoDB 的 User 表,這個表包含三個字段分別是 id,name 和 age。

其中 id 為主鍵 name 上添加了一個普通索引名字叫 n,接著我們像這條表中插入 10 億條數據。

表和數據都創建完了,下面我們就來說說為什么加上了索引還是查詢很慢,以及解決方案。

MySQL 會根據語句的執行時間來判斷 SQL 語句是否是慢查詢語句。

當一個 SQL 語句在執行時,MySQL 把語句執行時間和系統參數 long_query_time(這個參數的默認值是 10 秒,但是在實際項目中我們會將這個參數值設置為1秒甚至更短的時間) 作比較。

如果執行時間大于這個參數的值,那么就把這個語句記錄到慢查詢日志中。那么在語句執行過程中我們如何得知是否使用了索引呢?

這時我們就可以使用 explain 語句來查看數據結果中 Key 的值是否 null ,如果是 null 則說明沒有使用索引。

下面我們來看一個例子:

  1. explain select * from user
  2. explain select * from user where id=1; 
  3. explain select name from user

上面三個 explain 語句返回的 key 如下表所示:

 

從上表我們可以看出第一個語句沒有使用索引,第二個使用了主鍵索引,第三個語句使用 n 這個索引。

我們的 user 表有 10 億條數據,可想而知第一條查詢語句執行效率肯定低,第二個查詢語句看似執行效率高,其實在極端環境下(比如 CPU 高負載)也會出現查詢效率低的問題。

最后一個查詢語句呢雖然使用了 n 這個索引,但是它實際上執行了掃描整個索引樹的操作,因此查詢效率也高不到哪去。

綜上所述,我們可知索引是否使用和是否被記錄到慢查詢中幾乎沒有聯系,索引只是 SQL 的一個執行過程,SQL 的執行時間才是決定是否被記錄到慢查詢中的關鍵。

前面一小節我們只是簡單的分析了一下問題,下面我們進一步看這個問題。我們知道 InnoDB 是索引組織表,所有數據都存儲在索引樹上。

 

在 InnoDB 中數據放在主鍵索引里,因此理論上來說所有在 InnoDB 表中的查詢至少使用了一個索引。

比如這個 SQL 查詢語句 select * from user where id > 1000,很明顯它使用主鍵索引,并且這個語句一定執行了整個索引樹的掃描。

在 InnoDB 中只有一種情況叫不使用索引,就是從主鍵索引的最左邊的葉子結點開始向右掃描整個索引樹。

到目前為止我們已經知道了全索引掃描會造成查詢變慢,下面我們就來說一下另一個知識點過濾性 。

假如我們要查詢 user 表中 age 在 70 歲以上 80 歲以下的人員信息,你一定會在 age 字段上加入索引來避免全局掃描。

不錯,這是個好的想法,但是當你運行查詢語句時就會發現它依然執行的很慢,這是為什么呢?

 

要解答這個問題我們先來看一下 SQL 查詢語句的執行流程:

  • 搜索 age 索引樹,獲取到第一個 age 為 70 的記錄。
  • 拿到主鍵值,根據主鍵值去主鍵索引樹上獲取對應的信息,并將信息加入結果集。
  • 在 age 索引樹上向右側掃描,獲取到下一個主鍵值,執行第二部的操作。
  • 不斷執行上面的步驟,直到遇到第一個 age 大于 80 的記錄為止。

從上面的步驟中我們可以看出雖然使用了索引,但是查詢過程中掃描了上萬行甚至上億行。

因此我們可以得出結論:對于這種數據非常多的表,我們所要做的不僅僅是加入索引,還要保證索引的過濾性足夠優秀。

假如說我們把索引的過濾性也處理好了,是不是查詢時要掃描的行數就一定會表少呢?

這個答案是否定的,比如說我們的 user 表中的 name 和 age 字段共同組成了聯合索引并處理好了過濾性,這時當我們查詢姓李的并且年齡是 60 歲的數據時查詢效率依然很低。

 

我們先來看一下查詢語句的執行流程:

  • 首先從聯合索引上找到姓名字段是李字開頭的數據記錄。
  • 拿到主鍵值,根據主鍵值在主鍵索引書上去除匹配的數據。
  • 接著根據 age 字段去判斷年齡是否等于 60,如果符合就加入結果集。
  • 然后再聯合所以上向右側遍歷,并不斷做回表和判斷,直到遇到 name 的第一個字不是李的為止。

Tip:所謂的回表就是根據主鍵值去主鍵索引樹上查找對應的數據。

從上面的步驟中我們可以看出最耗時的就是回表,如果姓李的數據有 2 億條那么就要回表 2 億次,并且 SQL 在定位第一行數據時只能使用最左前綴原則。

這種耗時的回表操作步驟在 MySQL 5.6 及其以后的版本中已經做了 index condition pushdown 優化。

優化后的流程很簡單:

  • 首先從聯合索引上找到姓名字段是李字開頭的數據記錄,并判斷這個記錄里 age 是不是 60,如果是就執行回表取出數據假如結果集。
  • 重復步驟1,直到配當第一個字不是李字的記錄為止。

優化后和優化前的區別是把 age 的對比步驟放在了遍歷聯合索引樹上,減少了回表次數。

但是雖然減少了回表次數,聯合索引樹的遍歷去沒有減少依然要遍歷 2 億次,那么有沒有更好的優化方案呢?答案是有的,我們可以實虛擬列來進行處理。

首先我們需要把 name 的第一個字和 age 做一個聯合索引,讓虛擬列的值總是等于 name 字段的前兩個字節,這里需要注意的是虛擬列不隨著 insert 和 update 變化,它的值是自定義生成的。

語句如下:

  1. alter table user add name_first varchar(2) generated (left(name,1)),add index(name_first,age); 

經過上述的優化后聯合索引樹的查詢次數也降低了,本質上就是創建一個緊湊的索引加快查詢。

總結

這篇文章主要介紹了查詢優化的基本思路,只要記住優化查詢的過程都是減少掃描行數的過程,就可以做到在 SQL 查詢面前百戰百勝。

作者:朱鋼,筆名喵叔

簡介:.NET 高級開發人員,2019 年度博客之星 20 強,長期從事電子政務系統和AI客服系統的設計與開發,目前就職于國內某 BIM 大廠從事招投標軟件的開發。

編輯:陶家龍

征稿:有投稿、尋求報道意向技術人請聯絡 editor@51cto.com

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2022-08-04 08:22:49

MySQL索引

2025-06-12 03:25:00

2020-03-05 16:55:56

索引數據庫SQL

2020-08-10 11:20:59

索引MySQL數據庫

2025-11-26 08:21:31

2024-08-19 09:43:00

2021-06-28 07:13:35

SQL語句索引

2025-12-08 01:00:42

索引失效基數SQL

2021-06-11 09:33:33

索引SQL語句

2020-01-22 16:36:52

MYSQL開源數據庫

2020-11-27 06:58:24

索引

2024-12-02 08:01:47

加鎖高并發程序

2018-08-16 08:03:21

Python語言解釋器

2024-04-15 04:00:00

C#反射代碼

2015-07-08 14:47:56

JSPBeetl

2022-07-20 07:32:46

Prototypevalue?容器

2021-05-29 06:23:47

webpack esbuild

2016-12-28 11:28:19

.NET反射

2025-05-28 01:10:00

SQL索引MySQL

2020-08-14 09:11:29

RedisQPS數據庫
點贊
收藏

51CTO技術棧公眾號

亚洲视频观看| 狼人精品一区二区三区在线| 亚洲三级在线看| 国产免费一区二区三区视频| 久久亚洲一区| 日韩免费电影一区二区三区| 另类专区欧美蜜桃臀第一页| 免费不卡av在线| 日本一区二区综合亚洲| 免费男女羞羞的视频网站中文字幕| a在线播放不卡| 成年人视频免费看| 欧美日韩国产高清一区二区三区| 国外男同性恋在线看| 岛国视频午夜一区免费在线观看| 国产精品手机视频| 久久久蜜桃一区二区人| 日韩一区在线视频| 九七久久人人| 日韩欧美你懂的| aa视频在线观看| 久久精品国产清自在天天线| 都市激情久久| 国产不卡一区二区三区在线观看| 老鸭窝毛片一区二区三区| 欧美精品第一页| 日韩少妇内射免费播放18禁裸乳| 国内成人精品2018免费看| 天天综合中文字幕| 国产一本一道久久香蕉| 91九色国产ts另类人妖| 成人午夜大片免费观看| 黄色三级视频在线| 亚洲精品欧美专区| 亚州黄色一级| 欧美在线观看一区二区| 一本色道69色精品综合久久| 午夜精品久久久久久| 九色视频在线观看免费播放| 3d动漫精品啪啪| 日本高清不卡一区二区三区视频| 插插插亚洲综合网| 日韩欧美精品一区| 亚洲精品久久久久久一区二区| 精品综合免费视频观看| 蜜桃免费在线视频| 欧美性精品220| 素人一区二区三区| 99免费在线视频观看| 美女一区二区视频| 日日噜噜夜夜狠狠视频| 亚洲国产小视频| 999国产精品999久久久久久| 国产成人三级视频| 91精品91久久久中77777| 久久人体av| 日本福利一区二区三区| 一区二区三区在线免费| 日韩精品一区二区三区| 国产精品高潮视频| 91网站在线观看视频| 牛牛电影国产一区二区| 国产精品久久久久久久久久新婚| 国产真实乱偷精品视频免| 在线免费观看高清视频色| 色哟哟网站入口亚洲精品| 激情综合中文娱乐网| 国内av免费| 久久99国产综合精品女同| 久久国产尿小便嘘嘘| 三级在线电影| 国产精品一区二区久久久 | 一本色道久久综合狠狠躁篇怎么玩| 国产毛片一区二区三区| 国产一区二区网| 久久九九国产精品怡红院| 久久国产欧美日韩精品| 国产精品一二三区视频| 国产精品av在线播放| 亚洲一区二区三区精品在线| 国产精品毛片aⅴ一区二区三区| 成年人看的毛片| 亚洲一级一级97网| 一区二区三区四区五区在线| 91精品视频大全| 三级欧美日韩| 日韩一区二区三区三四区视频在线观看 | 久久99国产精品自在自在app| 亚洲第一精品影视| 激情在线小视频| 国产精品日韩欧美一区二区三区| 亚洲v日本v欧美v久久精品| 国产一区二区三区四区五区传媒| free性欧美1819hd| 亚洲最大福利网| 精品久久免费看| 不卡一区二区中文字幕| 欧美激情福利| 四虎最新地址发布| 成人做爰66片免费看网站| 亚洲国产成人精品久久| avtt综合网| 草草草视频在线观看| 欧美午夜影院一区| wwwxxx在线观看| 日韩精品一区二区三区四区| 精品国产免费人成电影在线观看四季| 欧美天堂一区二区| 岛国一区二区三区高清视频| 国产精品66| 欧美极品色图| 99成人在线| 欧美日韩国产精品激情在线播放| 国产综合色产在线精品 | 中文字幕中文字幕在线中心一区 | 91超碰caoporn97人人| 国产欧美高清视频在线| 国产成人综合亚洲| 不卡一区二区中文字幕| 亚洲精品一区二区在线看| 午夜欧美激情| 亚洲精品视频99| 内射国产内射夫妻免费频道| 狠狠色噜噜狠狠色综合久| 欧美精品aaa| 久久av资源网站| 亚洲第一福利网站| 欧美理论片在线| 精品国产鲁一鲁一区二区张丽| 成人免费视频app| 日日摸夜夜添夜夜添亚洲女人| 第一会所亚洲原创| 中文字幕亚洲影视| 国产午夜久久av| 午夜精品一区二区三区视频免费看| 亚洲r级在线视频| 18欧美乱大交hd1984| 99riav久久精品riav| 国产成人高清视频| 蜜桃免费网站一区二区三区 | 国产精品无码专区在线观看| 久久久久久国产三级电影| 亚洲欧美国产一本综合首页| 欧美日韩一卡二卡三卡| 欧美性猛交xxxxx水多| 欧美色欧美亚洲高清在线视频| 亚洲女人****多毛耸耸8| 亚洲激情校园春色| 色综合婷婷久久| 在线区一区二视频| 亚洲精品一区二区三区香蕉| 日韩女优视频免费观看| 亚洲国产精品网站| 中文字幕亚洲精品| 久久久久久高潮国产精品视| 欧美另类交人妖| 欧美亚州一区二区三区| 91一区二区三区| 免费看成人午夜电影| 亚洲AV无码成人精品一区| 毛片在线视频播放| 国产乱妇乱子| 宅男在线观看免费高清网站| 国产精品论坛| 日韩中文av| 久久久久久穴| 亚洲国产精品99久久久久久久久| 狠狠综合久久av一区二区小说| 欧美一级国产精品| 久久精品欧美视频| 国产精品福利视频| 一区二区三区高清国产| 国产精品第一第二| 免费看欧美黑人毛片| 久久久资源网| 超碰精品在线观看| 国产免费不卡| 九九久久婷婷| 麻豆91精品视频| 一级性生活视频| 国产欧美韩国高清| 国产精品夫妻激情| 日韩免费观看视频| 国产在线视频欧美| 2020国产精品久久精品不卡| 亚洲天堂男人天堂| 亚洲黄色www| 亚洲女在线观看| 亚洲国产精品人久久电影| 国产精品亲子伦对白| 性做久久久久久免费观看欧美| 国产日韩欧美综合一区| 亚洲午夜精品网| 成人黄视频免费| 小h片在线观看| 无码av中文一区二区三区桃花岛| 久久久免费看| 欧美呦呦网站| 91精品国产综合久久久久久久久久 | 在线xxxx|