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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

sql如何获取全部的索引名称_这句简单的sql,如何加索引?颠覆了我多年的认知...

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql如何获取全部的索引名称_这句简单的sql,如何加索引?颠覆了我多年的认知... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,轉載請保留出處。

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

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

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

準備階段

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

CREATE TABLE `test` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

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

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

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

create INDEX idx_a_b_c on test(a,b,c);
create INDEX idx_a_c_b on test(a,c,b);
create INDEX idx_b_a_c on test(b,a,c);
create INDEX idx_b_c_a on test(b,c,a);
create INDEX idx_c_a_b on test(c,a,b);
create INDEX idx_c_b_a on test(c,b,a);

使用Explain進行驗證

1、自動選用索引

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

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

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

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。

explain select * from testFORCE 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上有兩個參數。

explain select * from testFORCE INDEX(idx_b_c_a)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 全表掃描,性能最差

Extrausing 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,歡迎添加好友,進一步交流。

《必看!java后端,亮劍誅仙》
后端技術索引,中肯火爆

《Linux上,最常用的一批命令解析(10年精選)》
CSDN發布首日,1k贊。點贊率1/8。

《這次要是講不明白Spring Cloud核心組件,那我就白編這故事了》
用故事講解核心組件,包你滿意

總結

以上是生活随笔為你收集整理的sql如何获取全部的索引名称_这句简单的sql,如何加索引?颠覆了我多年的认知...的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲一级Av无码毛片久久精品 | 黄大色黄大片女爽一次 | 国产视频精选 | 福利国产视频 | 成熟了的熟妇毛茸茸 | 欧美区一区二 | 国家队动漫免费观看在线观看晨光 | 黄色网一级片 | 日韩精品tv | 一区二区三区在线不卡 | 激情六月婷婷 | 午夜精品久久久久久99热 | 非洲黄色片 | 日本人妻丰满熟妇久久久久久 | 久久久久久久女国产乱让韩 | 中字幕视频在线永久在线观看免费 | 亚洲一区日韩精品 | 高潮在线视频 | 后宫秀女调教(高h,np) | 日韩经典第一页 | 国产丝袜视频 | 韩国精品在线观看 | 秋霞成人午夜伦在线观看 | 91精品人妻一区二区三区蜜桃欧美 | 国产一区二区三区四区在线观看 | 成年人av在线 | 亚洲最大的黄色网 | 亚洲影院在线播放 | 色噜噜一区二区 | 日韩精品视频免费播放 | 色综合av在线 | 日韩免费av一区 | 亚洲av无码一区二区三区在线观看 | 精品一区李梓熙捆绑 | 高潮白浆女日韩av免费看 | 怡红院一区 | 9999热视频| 熟妇人妻无乱码中文字幕真矢织江 | 毛片无码一区二区三区a片视频 | 日本人做受免费视频 | 一区二区三区激情视频 | av无码一区二区三区 | 四虎成人在线视频 | 日本大胆裸体做爰视频 | 日韩一区二区三区视频在线 | 亚洲jlzzjizz少妇 | 波多野结衣网站 | 黄色av中文字幕 | 天天做天天爱天天操 | 日本亲子乱子伦xxxx | www.伊人网 | 欧美一级免费观看 | 国产精品美女www爽爽爽 | av丝袜天堂| 成年网站在线观看 | 韩漫动漫免费大全在线观看 | 青青草综合视频 | 日韩无套无码精品 | 高清国产在线观看 | 午夜天堂在线观看 | 日韩女优网站 | 91视频xxx| 伊人网av在线 | 丁香花高清视频完整电影 | 日本三级一区二区 | 9999视频| 中出一区| a一级黄色片 | 久久精品偷拍视频 | 午夜久久久 | 国产一卡二卡三卡四卡 | 中国xxxx性xxxx产国 | 日韩欧美国产亚洲 | 欧美一区影院 | 久草视频免费在线观看 | av丝袜天堂 | av有码在线| 高清国产一区二区三区四区五区 | 美女擦边视频 | 美女调教视频 | 啪啪视屏| 日韩精品一区二区三区高清免费 | 91精品国产综合久久久蜜臀图片 | 中文字幕 日韩 欧美 | 日本免费一区二区三区四区五六区 | 91视频在线免费观看 | 亚洲18在线看污www麻豆 | 五月六月丁香 | 亚洲欧美激情一区二区三区 | 超碰pron| 国产黄色观看 | 亚洲视频国产精品 | 成年人精品视频 | 清纯唯美亚洲 | av片免费在线播放 | 亚洲美女福利视频 | 天天久久 | a一级黄色| 丰满人妻一区二区三区精品高清 |