成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

10分鐘讓你明白MySQL是如何利用索引的

數(shù)據(jù)庫 MySQL
在MySQL中進行SQL優(yōu)化的時候,經(jīng)常會在一些情況下,對MySQL能否利用索引有一些迷惑。今天,我將會用一個模型,把這些問題都一一解答,讓你對MySQL索引的使用不再畏懼。

一、前言

在MySQL中進行SQL優(yōu)化的時候,經(jīng)常會在一些情況下,對MySQL能否利用索引有一些迷惑。

譬如:

1、MySQL 在遇到范圍查詢條件的時候就停止匹配了,那么到底是哪些范圍條件?

2、MySQL 在LIKE進行模糊匹配的時候又是如何利用索引的呢?

3、MySQL 到底在怎么樣的情況下能夠利用索引進行排序?

今天,我將會用一個模型,把這些問題都一一解答,讓你對MySQL索引的使用不再畏懼。

二、知識補充

key_len

EXPLAIN執(zhí)行計劃中有一列 key_len 用于表示本次查詢中,所選擇的索引長度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列被選擇了。

在這里 key_len 大小的計算規(guī)則是:

  • 一般地,key_len 等于索引列類型字節(jié)長度,例如int類型為4 bytes,bigint為8 bytes;
  • 如果是字符串類型,還需要同時考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes;
  • 若該列類型定義時允許NULL,其key_len還需要再加 1 bytes;
  • 若該列類型為變長類型,例如 VARCHAR(TEXT\BLOB不允許整列創(chuàng)建索引,如果創(chuàng)建部分索引也被視為動態(tài)列類型),其key_len還需要再加 2 bytes;

三、哪些條件能用到索引

首先非常感謝登博,給了我一個很好的啟發(fā),我通過他的文章,然后結合自己的理解,制作出了這幅圖

 

乍一看,是不是很暈,不急,我們慢慢來看

圖中一共分了三個部分:

1、Index Key :MySQL是用來確定掃描的數(shù)據(jù)范圍,實際就是可以利用到的MySQL索引部分,體現(xiàn)在Key Length。

2、Index Filter:MySQL用來確定哪些數(shù)據(jù)是可以用索引去過濾,在啟用ICP后,可以用上索引的部分。

3、Table Filter:MySQL無法用索引過濾,回表取回行數(shù)據(jù)后,到server層進行數(shù)據(jù)過濾。

我們細細展開。

Index Key

Index Key是用來確定MySQL的一個掃描范圍,分為上邊界和下邊界。

MySQL利用=、>=、> 來確定下邊界(first key),利用最左原則,首先判斷***個索引鍵值在where條件中是否存在,如果存在,則判斷比較符號,如果為(=,>=)中的一種,加入下邊界的界定,然后繼續(xù)判斷下一個索引鍵,如果存在且是(>),則將該鍵值加入到下邊界的界定,停止匹配下一個索引鍵;如果不存在,直接停止下邊界匹配。

  1. exp: 
  2. idx_c1_c2_c3(c1,c2,c3) 
  3. where c1>=1 and c2>2 and c3=1 
  4. -->  first key (c1,c2) 
  5. --> c1為 '>=' ,加入下邊界界定,繼續(xù)匹配下一個 
  6. -->c2 為 '>',加入下邊界界定,停止匹配 

上邊界(last key)和下邊界(first key)類似,首先判斷是否是否是(=,<=)中的一種,如果是,加入界定,繼續(xù)下一個索引鍵值匹配,如果是(<),加入界定,停止匹配

  1. exp: 
  2.  
  3. idx_c1_c2_c3(c1,c2,c3) 
  4.  
  5. where c1<=1 and c2=2 and c3<3 
  6.  
  7. --> first key (c1,c2,c3) 
  8.  
  9. --> c1為 '<=',加入上邊界界定,繼續(xù)匹配下一個 
  10.  
  11. --> c2為 '='加入上邊界界定,繼續(xù)匹配下一個 
  12.  
  13. --> c3 為 '<',加入上邊界界定,停止匹配 

注:這里簡單的記憶是,如果比較符號中包含'='號,'>='也是包含'=',那么該索引鍵是可以被利用的,可以繼續(xù)匹配后面的索引鍵值;如果不存在'=',也就是'>','<',這兩個,后面的索引鍵值就無法匹配了。同時,上下邊界是不可以混用的,哪個邊界能利用索引的的鍵值多,就是最終能夠利用索引鍵值的個數(shù)。

Index Filter

字面理解就是可以用索引去過濾。也就是字段在索引鍵值中,但是無法用去確定Index Key的部分。

  1. exp: 
  2.  
  3. idex_c1_c2_c3 
  4.  
  5. where c1>=1 and c2<=2 and c3 =1 
  6.  
  7. index key --> c1 
  8.  
  9. index filter--> c2 c3 

這里為什么index key 只是c1呢?因為c2 是用來確定上邊界的,但是上邊界的c1沒有出現(xiàn)(<=,=),而下邊界中,c1是>=,c2沒有出現(xiàn),因此index key 只有c1字段。c2,c3 都出現(xiàn)在索引中,被當做index filter. 

Table Filter

無法利用索引完成過濾,就只能用table filter。此時引擎層會將行數(shù)據(jù)返回到server層,然后server層進行table filter。

四、Between 和Like 的處理

那么如果查詢中存在between 和like,MySQL是如何進行處理的呢? 

Between

where c1 between  'a' and 'b' 等價于 where c1>='a' and c1 <='b',所以進行相應的替換,然后帶入上層模型,確定上下邊界即可

Like

首先需要確認的是%不能是最在最左側,where c1 like '%a' 這樣的查詢是無法利用索引的,因為索引的匹配需要符合最左前綴原則

where c1 like 'a%'  其實等價于 where c1>='a' and c1<'b' 大家可以仔細思考下。 

五、索引的排序

在數(shù)據(jù)庫中,如果無法利用索引完成排序,隨著過濾數(shù)據(jù)的數(shù)據(jù)量的上升,排序的成本會越來越大,即使是采用了limit,但是數(shù)據(jù)庫是會選擇將結果集進行全部排序,再取排序后的limit 記錄,而且MySQL 針對可以用索引完成排序的limit 有優(yōu)化,更能減少成本。

Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index – in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated.

  1. CREATE TABLE `t1` (    
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,    
  3.   `c1` int(11) NOT NULL DEFAULT '0',    
  4.   `c2` int(11) NOT NULL DEFAULT '0',    
  5.   `c3` int(11) NOT NULL DEFAULT '0',    
  6.   `c4` int(11) NOT NULL DEFAULT '0',    
  7.   `c5` int(11) NOT NULL DEFAULT '0',    
  8.   PRIMARY KEY (`id`),    
  9.   KEY `idx_c1_c2_c3` (`c1`,`c2`,`c3`)    
  10. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4    
  11.  
  12.  select * from t1;    
  13. +----+----+----+----+----+----+    
  14. | id | c1 | c2 | c3 | c4 | c5 |    
  15. +----+----+----+----+----+----+    
  16. |  1 |  3 |  3 |  2 |  0 |  0 |    
  17. |  2 |  2 |  4 |  5 |  0 |  0 |    
  18. |  3 |  3 |  2 |  4 |  0 |  0 |    
  19. |  4 |  1 |  3 |  2 |  0 |  0 |    
  20. |  5 |  1 |  3 |  3 |  0 |  0 |    
  21. |  6 |  2 |  3 |  5 |  0 |  0 |    
  22. |  7 |  3 |  2 |  6 |  0 |  0 |    
  23. +----+----+----+----+----+----+    
  24. rows in set (0.00 sec)    
  25.  
  26.  select c1,c2,c3 from t1;    
  27. +----+----+----+    
  28. | c1 | c2 | c3 |    
  29. +----+----+----+    
  30. |  1 |  3 |  2 |    
  31. |  1 |  3 |  3 |    
  32. |  2 |  3 |  5 |    
  33. |  2 |  4 |  5 |    
  34. |  3 |  2 |  4 |    
  35. |  3 |  2 |  6 |    
  36. |  3 |  3 |  2 |    
  37. +----+----+----+    
  38. rows in set (0.00 sec)  

存在一張表,c1,c2,c3上面有索引,select c1,c2,c3 from t1; 查詢走的是索引全掃描,因此呈現(xiàn)的數(shù)據(jù)相當于在沒有索引的情況下select c1,c2,c3 from t1 order by c1,c2,c3; 的結果

因此,索引的有序性規(guī)則是怎么樣的呢?

c1=3 —> c2 有序,c3 無序

c1=3,c2=2 — > c3 有序

c1 in(1,2) —> c2 無序 ,c3 無序

有個小規(guī)律,idx_c1_c2_c3,那么如何確定某個字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二個位置,只有在c1 ***確定一個值的時候,c2才是有序的,如果c1有多個值,那么c2 將不一定有序,同理,c3也是類似

六、小結 

針對MySQL索引,我這邊只是提到了在單表查詢情況下的模型,通過這篇文章,想必大家應該了解到MySQL大部分情況下是如何利用索引的,如果存在疑問,歡迎聯(lián)系我 

責任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關推薦

2021-11-07 23:46:32

MySQLSQL索引

2021-11-11 15:03:35

MySQLSQL索引

2017-06-07 18:40:33

PromiseJavascript前端

2020-11-06 08:54:43

Vue 3.0函數(shù)代碼

2019-05-08 14:02:52

MySQL索引查詢優(yōu)化數(shù)據(jù)庫

2021-01-07 08:05:20

JenkinsDevOps

2021-04-23 09:50:41

topLinux命令

2019-10-12 08:36:48

Java程序員數(shù)據(jù)結構

2021-08-02 15:40:20

Java日志工具

2021-03-04 09:26:57

微服務架構數(shù)據(jù)

2023-01-03 08:36:34

MySQL索引

2019-07-19 14:06:48

APP代碼打包

2019-04-01 14:01:13

B+樹索引哈希索引算法

2019-06-05 09:42:53

Kafka App 消息隊列

2011-06-10 14:19:49

SEO百度收錄

2009-11-05 10:56:31

WCF通訊

2021-05-17 20:13:50

數(shù)倉操作型數(shù)據(jù)庫

2024-04-28 12:55:46

redis頻道機制

2023-07-15 18:26:51

LinuxABI

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人免费在线 | 久久99精品久久久久久琪琪 | 欧美视频偷拍 | 日韩欧美国产不卡 | 国产一区二区毛片 | 九九亚洲 | 成人免费黄色片 | 亚洲性视频网站 | 国产激情在线观看视频 | 欧美日韩专区 | 天天搞夜夜操 | 一级国产精品一级国产精品片 | 在线免费观看成年人视频 | 亚洲高清视频在线观看 | 国产精品视频在线观看 | aⅴ色国产 欧美 | 亚洲一级毛片 | 亚洲综合色视频在线观看 | 97精品国产| 涩色视频在线观看 | 欧美一区二区在线观看视频 | 久久精品国产v日韩v亚洲 | 久草资源| 成人在线小视频 | 五月综合色啪 | 色一级片 | 黄色在线网站 | 99自拍视频 | 国产精品视频偷伦精品视频 | 欧美a视频 | 久久精品aaa | 欧美一区二区三区电影 | 精精国产xxxx视频在线播放7 | 久久在线视频 | 亚洲精品久久国产高清情趣图文 | 久久中文网 | 日韩成人高清在线 | 欧美成人a | 久久久美女 | 成人深夜福利 | 国产情侣一区 |