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

這句簡單的SQL,如何加索引?顛覆了我多年的認知

運維 數據庫運維
不啰嗦,直接入正題。問題是這樣的。請問下面的sql語句,要想加快查詢速度,該怎么創建索引?以下,以mysql數據庫為準。

 [[275725]]

不啰嗦,直接入正題。問題是這樣的。請問下面的sql語句,要想加快查詢速度,該怎么創建索引?以下,以mysql數據庫為準。

  1. select * from test where a=? and b>? order by c limit 0,100 

結果可能會出乎你的意料。我們首先準備一下運行環境,然后按照最左前綴原則和explain關鍵字來進行驗證。結果真是顛覆了xjjdog多年的認知。

準備階段

為了進行驗證,我們創建一個簡單的數據表。里面有a、b、c三個簡單的int字段。

  1. CREATE TABLE `test` ( 
  2.   `id` int(11) NOT NULL
  3.   `a` int(11) DEFAULT NULL
  4.   `b` int(11) DEFAULT NULL
  5.   `c` int(11) DEFAULT NULL
  6.   PRIMARY KEY (`id`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

接下來,寫一個簡單的存儲過程,來插入10w條數據。等待大約1分鐘,數據插入完畢。

  1. DROP PROCEDURE IF EXISTS test_initData; 
  2. DELIMITER $ 
  3. CREATE PROCEDURE test_initData() 
  4. BEGIN 
  5.     DECLARE i INT DEFAULT 1; 
  6.     WHILE i<=100000 DO 
  7.         INSERT INTO test(id,a,b,c) VALUES(i,i*2,i*3,i*4); 
  8.         SET i = i+1; 
  9.     END WHILE; 
  10. END $ 
  11. CALL test_initData(); 

由于mysql有最左前綴原則,我們對abc三列進行了全排列,創建了6個索引。這6個索引涵蓋了所有的根據abc查詢的情況。

  1. create INDEX idx_a_b_c on test(a,b,c); 
  2. create INDEX idx_a_c_b on test(a,c,b); 
  3. create INDEX idx_b_a_c on test(b,a,c); 
  4. create INDEX idx_b_c_a on test(b,c,a); 
  5. create INDEX idx_c_a_b on test(c,a,b); 
  6. create INDEX idx_c_b_a on test(c,b,a); 

使用Explain進行驗證

1、自動選用索引

  1. explain select * from test where a>10 and b >10  order by c 

首先,我們拿上面的sql語句進行驗證。結果發現,查詢使用了索引idx_a_b_c,只用到了前綴a,b。而extra部分,則用到了filesort,也就是性能非常差的方式。

 

我們嘗試換一下查詢參數的位置。

  1. explain select * from test where c>10 and b >10 order by a 

 

這次索引自動選擇了idx_b_a_c,但依然使用的filesort,查詢效果是一樣的。按照上面的邏輯,不是應該選擇idx_b_c_a么?

2、指定索引

接下來使用force index方式,強制指定索引。

這里直接給出結果,就是下面的sql。

  1. explain select * from test 
  2.     FORCE INDEX(idx_c_b_a)    where a>10 and b >10  order by c 

結果如下。

 

我們使用force index來指定使用的索引。這次效果非常好,顯示使用了index,使用了where,只在索引上就完成了操作。但掃描的行數卻增加了。

但是,這與我們的經驗是相悖的。idx_c_b_a的索引,是在字段(c,b,a)上創建的。按照最左原則,支持的搜索條件有:c,cb,cba。在這個例子中,order by后面的參數,卻被當作了前綴的頭部信息。

我們刪掉其他索引,只留下idx_c_b_a,然后去掉force index部分。結果發現,mysql現在能夠自動的選擇索引了。

再看另外一種情況,order by上有兩個參數。

  1. explain select * from test 
  2.     FORCE INDEX(idx_b_c_a) 
  3.     where a>10   order by b,c 

結果如上,使用idx_b_c_a,不走filesort。其他索引都不是最優。

3、explain部分返回值意義

我們得出上面的結論,是根據mysql自己提供的explain工具。這個工具能夠輸出一些有用的信息。下面是相關的部分返回值的意義。

select_type

表示SELECT的類型,常見的取值有:

SIMPLE 簡單表,不使用表連接或子查詢。

PRIMARY 主查詢,即外層的查詢。

UNION UNION中的第二個或者后面的查詢語句。

SUBQUERY 子查詢中的第一個。

type

表示MySQL在表中找到所需行的方式,或者叫訪問類型。常見訪問類型如下,從下到上,性能越來越差。

system,const 表只有一行記錄(等于系統表),這是const類型的特列。

eq_ref 唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。

ref 非唯一性索引掃描,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體。

range 只檢索給定范圍的行,使用一個索引來選擇行,key列顯示使用了哪個索引。這種范圍掃描索引比全表掃描要好,因為它只需要開始于索引的某一點,而結束于另一點,不用掃描全部索引。

index Full Index Scan,Index與All區別為index類型只遍歷索引樹。這通常比ALL快,因為索引文件通常比數據文件小。

all 全表掃描,性能最差

Extra

using index

表示相應的select操作中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。如果同時出現using where,表明索引被用來執行索引鍵值的查找;如果沒有同時出現using where,表明索引用來讀取數據而非執行查找動作。

using filesort

說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱為“文件排序”。

using temporary

使用了用臨時表保存中間結果,mysql在對查詢結果排序時使用臨時表。常見于排序order by和分組查詢group by。

End

可以看到,在我們創建了多個索引的時候,mysql的查詢優化,并不一定能夠進行智能的解析、用到最優的方式,需要使用force index指定索引。

mysql中的索引,主要就用在where條件中和排序動作中。分兩種情況。

1、先過濾,再排序,會用到過濾條件中的索引參數,但是排序會使用較慢的外部排序。因為這個結果集是經過過濾的,并沒有什么索引參與。

2、先排序,再過濾,可以使用同一個索引,排序的優先級高于過濾的優先級。選擇合適的索引,在過濾的同時就把這個事給辦了。但是掃描的行數會增加。

我想,mysql并不能夠了解到這兩個過程,到底誰快誰慢,于是選了一個最通用的方式,直接選用了第一種。甚至在索引非常多的時候,直接暈菜了。索引建多了,你可能間接把mysql給害了。這是現象,至于深層次的原因,歡迎讀過mysql相關源碼的給解釋一下。

這對經常變換字段進行排序的代碼來說,并不是一個好的信號??紤]到程序的穩定性,我想應該要盡量減少where條件過濾后的結果集。這種情況下,創建一個(a,b)的聯合索引,或許是一個折衷的方式。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2019-12-04 07:39:07

MySQL索引數據庫

2020-04-03 09:45:09

Java多線程接口

2020-02-06 11:30:08

代碼JavaScript&&

2021-01-31 10:50:45

JavaC++抽象

2014-11-27 17:10:46

身份認證認知指紋生物識別

2025-12-08 09:00:00

AI工具人工智能能

2022-01-24 07:20:05

DevOps軟件開發

2025-07-28 04:22:00

2022-08-18 09:51:50

Python代碼循環

2009-10-21 14:04:46

2020-06-12 09:07:03

技術總監數據庫

2021-05-10 07:30:33

Google技術谷歌

2025-08-13 03:00:00

DOMAPI元素

2018-01-13 23:17:55

谷歌研究報告團隊建設

2021-09-06 06:45:06

普通索引唯一

2013-04-22 10:34:46

用戶體驗設計UED認知負荷

2014-08-28 09:54:35

SQL Server

2025-05-29 09:14:17

2019-07-09 16:00:18

阿里數據庫技術思維

2019-07-15 09:21:45

技術思維阿里
點贊
收藏

51CTO技術棧公眾號

国产在线黄色| 日韩亚洲第一页| 欧美h视频在线| 日韩高清国产一区在线| 久久精品国产综合精品| 国内揄拍国内精品久久| 免费精品视频一区二区三区| 欧美亚洲自偷自偷| 成人在线免费观看视频网站| av一二三不卡影片| 99视频免费| 欧美日韩免费看| 免费黄色网页在线观看| 亚洲成人性视频| gogo久久日韩裸体艺术| 久久久久免费网| 成人午夜电影久久影院| 国产在线制服美女| 日韩欧美一级精品久久| 欧美精品中文| 国产精品96久久久久久| 中文字幕一区二区三区四区久久 | 好吊视频一区二区三区四区| 国产激情视频一区| 国产伦精品一区二区三区视频| 欧美极品欧美精品欧美视频| 久久av影视| 日本女优爱爱视频| 日韩成人性视频| 久久av综合| 欧美女同在线观看| 亚洲激情成人网| 精品国产一区二区三区香蕉沈先生 | 欧美日韩高清在线观看| 亚洲国产精品第一区二区| 人人干人人干人人| 亚洲欧美国产精品久久久久久久| 久久久久电影| 亚洲男男gay视频| 日韩专区在线播放| 韩国精品久久久| 亚洲综合图区| 麻豆91蜜桃| 91高清视频免费看| 小处雏高清一区二区三区| 高清av电影在线观看| 欧美丝袜自拍制服另类| 伊人在我在线看导航| 日本韩国欧美一区二区三区| 成a人片在线观看| 欧美精品色综合| 伦理av在线| 亚洲第一色中文字幕| 久久天天久久| 亚洲一区三区视频在线观看| a级高清视频欧美日韩| 日本中文字幕在线2020| 亚洲黄色尤物视频| 三级小说欧洲区亚洲区| 国产精品国产三级国产专区53| 图片区小说区国产精品视频| 精品freesex老太交| 伊人中文字幕在线| 国产伦视频一区二区三区| 欧美羞羞免费网站| 日本不卡123| 伊人久久大香| 一区二区三区视频国产日韩| 欧美高清性xxxxhd| 一区二区三区四区视频| 国产精品入口麻豆九色| 中文字幕人成人乱码| 伊人影院在线视频| 欧美大片免费播放| 欧美精品www| 精品久久久久久久久久久久久| 激情欧美一区| www.久久草.com| 成黄免费在线| 亚洲av首页在线| 久久久久久欧美精品色一二三四| 色婷婷综合成人| 在线成人免费视频| 欧美日韩高清在线| 午夜视频一区二区| 一区二区三区中文字幕精品精品| 成人看片黄a免费看在线| 亚洲精品九九| 欧美精美视频| 亚洲综合色婷婷在线观看| 国产天堂在线播放视频| 欧美日韩激情四射| 欧美三级华人主播| 亚洲一区二区三区四区在线播放| 亚洲社区在线观看| 91精品免费观看| 日韩欧美a级成人黄色| 久久蜜桃一区二区| 免费观看久久久4p| 欧美1区视频| 91精品国产视频| 99热精品久久| 国产欧美日韩精品一区二区三区 | 美乳少妇欧美精品| 国产亚洲日本欧美韩国| 6080亚洲精品一区二区| 亚洲一区二区美女| 国产精品嫩草久久久久| 黄色欧美日韩| 在线观看视频一区二区三区| caoporn视频在线| 欧美va在线观看| 亚洲高清黄色| 欧美少妇精品| 国产精品久久久久久久久久三级| 亚洲欧美在线磁力| 国产欧美精品一区aⅴ影院| 免费在线日韩av| 麻豆精品视频在线| 国产在线精品一区二区三区不卡| 国产一区欧美一区| 久久亚洲一级片| 青青伊人久久| 在线看黄色av| 欧美日韩激情视频在线观看| xxxx欧美18另类的高清| 亚洲视频一二三区| 国产自产视频一区二区三区| 日本在线视频一区二区三区| 在线欧美一级视频| 黄色一级视频在线播放| 亚洲字幕在线观看| 久久精品小视频| 精品成人在线观看| 亚洲欧美日韩小说| 国产麻豆精品视频| 影音先锋中文字幕一区| 日韩大胆成人| 日本伊人久久| 韩国精品主播一区二区在线观看| 国产中文在线| 热久久最新地址| 成人一区二区电影| 欧美成人免费在线视频| 亚洲激情在线视频| 一区二区三区高清| 最新久久zyz资源站| 日韩av一级片| 欧美电影三区| 白白色在线观看| 国产男女无遮挡| 欧美一区二区视频在线| 成人精品久久一区二区三区| 97福利一区二区| 91成人在线视频| 亚洲国产精品久久久久秋霞蜜臀| 色噜噜狠狠成人中文综合| 久久av资源网站| 欧美午夜精品久久久久久浪潮| 97视频国产在线| 亚洲视频在线观看一区| 日本不卡高清| 国产亚洲欧美在线| www.亚洲激情.com| 成人激情视频网站| 久久一日本道色综合| 国产亚洲欧美在线| 国产精品女主播在线观看| 99re这里只有精品首页| 中文字幕av资源一区| 懂色av噜噜一区二区三区av| 美女爽到高潮91| 国产精品99久久不卡二区| 亚洲一区二区成人| 日本aⅴ精品一区二区三区| 国产蜜臀av在线一区二区三区| 日本不卡高清视频| 视频一区欧美日韩| 免费成人av在线播放| 最新国产精品视频| 欧洲精品一区二区三区| 国产高清免费在线播放| 1769在线观看| 伊人成综合网站| 婷婷激情成人| 美女午夜精品| 99久久99久久精品国产片果冰| 偷偷www综合久久久久久久| 99久久.com| 大奶在线精品| 九七影院97影院理论片久久| 亚洲永久精品唐人导航网址| 影音先锋日韩在线| 久久99国产精品麻豆| 亚洲综合激情另类小说区| 欧美精品日韩一本| 亚洲精品中文字幕av| 日本最新不卡在线| 亚洲午夜免费电影| 日韩成人视屏|