亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

你的like語句為什么沒索引詳解

2024-07-25 19:09:07
字體:
來源:轉載
供稿:網友

前言

本文旨在用最通俗的語言講述最枯燥的基本知識

這個話題比較有意思。昨天中午吃完飯間突然有個同事蹦出了一句:“like有索引嗎?”,我順口就說沒有,另一個同事反駁說有啊,還有些同事說看情況的有,這下有點懵逼了,都不知道那種說法是正確的,于是決定花了個半小時來研究驗證這個問題,終于得到答案。

怎么驗證的呢?

坊間有傳言:MySQL性能優化有個神器,叫做explain,它可以對select語句進行分析并且輸出詳細的select執行過程的詳細信息,讓開發者從這些信息中獲得優化的思路。

下面來講講這個MySQL提供的explain命令:

語法:explain SQL語句例如:

1explain select * from user where id=1

執行完畢之后,它的輸出有以下字段:

  id
  select_type
  table
  partitions
  type
  possible_keys
  key
  key_len
  ref
  rows
  Extra

要想知道explain命名怎么使用,就必須把這些字段搞清楚

1. id 

SELECT查詢的標識符, 每個SELECT語句都會自動分配一個唯一的標識符

2. select_type 

每個select查詢字句的類型,具體類型以及對應作用如下表:

類型名 解釋
SIMPLE 簡單SELECT,不使用UNION或子查詢等
PRIMARY 查詢中若包含任何復雜的子部分,最外層的select被標記為PRIMARY
UNION UNION中的第二個或后面的SELECT語句
DEPENDENT UNION UNION中的第二個或后面的SELECT語句,取決于外面的查詢
UNION RESULT UNION的結果
SUBQUERY 子查詢中的第一個SELECT
DEPENDENT SUBQUERY 子查詢中的第一個SELECT,取決于外面的查詢
DERIVED 派生表的SELECT, FROM子句的子查詢
UNCACHEABLE SUBQUERY 一個子查詢的結果不能被緩存,必須重新評估外鏈接的第一行

3. table 

顯示這一行的數據是查哪張表的,不過有時短路顯示的不是真實的表名。

4. partitions 

匹配的分區(這個目前用處不大)

5. type 

訪問類型,表示MySQL在表中找到所需行的方式,對應的值和解釋如下:

類型名 優級別 解釋
system 1 表僅有一行
const 2 表最多有一個匹配行,在查詢開始時即被讀取
eq_ref 3 使用primary key或者unique key作為多表連接的條件,僅從該表中讀取一行
ref 4 作為查詢條件的索引在每個表匹配索引值的行從表中讀取出來
fulltext 5 全文索引檢索
ref_or_null 6 和ref一致,但增加了NULL值查詢支持
index_merge 7 表示使用了索引合并優化方法
unique_subquery 8 使用了替換了in子查詢
index_subquery 9 使用了替換了in子查詢,但只適用于子查詢中的非唯一索引
range 10 只檢索給定范圍的行,使用一個索引來選擇行
index 11 全表掃描,但掃描表的方式是按索引的次序進行
ALL 12 全表掃描的方式找到匹配的行

type作為訪問類型,其值代表著當前查詢所用的類型,是體現性能的一個重要指標,從表中可以看到,從上到下,掃描表的方式越來越寬,性能也就越來越差,因此,對于一個查詢,最好能保持在range級別以上。

6. possible_keys 

主動指出查詢能用哪個索引在表中找到記錄也就是會列出在查詢中的字段中有索引的字段,但不一定被查詢所用。

7. key 

顯示再查詢中實際使用的索引/鍵,如果沒有索引,則顯示NULL。但如果想強制查詢中使用或忽視possible_keys列中的索引,則可以在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

8. key_len 

表示索引中使用的字節數。

9. ref 

表示哪些列或常量被用于查找索引列上的值。

10. rows 

顯示當前查詢估算到的查找到匹配記錄所需的記錄行數。

11. Extra 

顯示當前查詢所用的解決方式,它有以下幾種情況:

類型名 解釋
Using where 列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,
Using temporary 表示MySQL需要使用臨時表來存儲結果集,常見于排序和分組查詢
Using filesort MySQL中無法利用索引完成的排序操作稱為“文件排序”
Using join buffer 改值強調了在獲取連接條件時沒有使用索引,并且需要連接緩沖區來存儲中間結果。如果出現了這個值,那應該注意,根據查詢的具體情況可能需要添加索引來改進能。
Impossible where 這個值強調了where語句會導致沒有符合條件的行。
Select tables optimized away 這個值意味著僅通過使用索引,優化器可能僅從聚合函數結果中返回一行

講完了語法,我們來實際操作一波,首先創建個表:

-- 創建表CREATE TABLE test(id INT(11) NOT NULL AUTO_INCREMENT,uname VARCHAR(255),PRIMARY KEY(id) );

然后給uname字段加上索引:

-- 添加索引ALTER TABLE test ADD INDEX uname_index (uname);

查看一下索引是否添加成功:

-- 查看是否有索引SHOW INDEX FROM test;

輸出結果為:

like語句,索引

可以看出索引已經創建成功,接下來添加一些數據:

-- 添加一些數據INSERT INTO test VALUES(1,'jay');INSERT INTO test VALUES(2,'ja');INSERT INTO test VALUES(3,'bril');INSERT INTO test VALUES(4,'aybar');

一切準備就緒,下面用explain這個命令來探究一些like語句是否有索引,like有四種情況,分別為沒有%、 %% 、左%、右%、

1. like 字段名 

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j'; 

輸出為:

like語句,索引

可以看出:type的值為:range,key的值為uname_index,也就是說這種情況下,使用了索引。

2. like %字段名% 

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%'; 

輸出為:

like語句,索引

可以看出:type的值為ALL也就是全表掃描,而且key的值為NULL,也就是說沒用到任何索引。

3. like %字段名 

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j'; 

輸出為:

like語句,索引

可以看出:type的值為ALL,key的值為NULL,同樣沒用到索引。

4. like 字段名% 

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%'; 

輸出為:

like語句,索引

可以看出:type的值為:range,key的值為uname_index,也就是說這種情況下,使用了索引。

總結 

由上面的試驗可以總結出like是否使用索引的規律:like語句要使索引生效,like后不能以%開始,也就是說 (like %字段名%)  、(like %字段名)這類語句會使索引失效,而(like 字段名)、(like 字段名%)這類語句索引是可以正常使用。

其它 

為了查證like索引的問題,研究了MySQL神奇explain,但explain不僅僅只能檢查索引使用情況,還可以提供很多其它的性能優化方面的幫助,至于具體的使用,其實跟上面講的一樣,把explain結果列出來,然后順藤摸瓜查閱相關的字段就可以得到相應的內容。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区二区三区在线能观看| 亚洲国产欧美日韩精品| 欧美在线观看一区二区三区| 久久久www成人免费精品张筱雨| 亚洲va欧美va国产综合剧情| 欧美二区在线播放| 国产美女精品视频免费观看| 欧美精品少妇videofree| 欧美日韩国产123| 激情成人在线视频| 欧美最顶级的aⅴ艳星| 国产精品福利无圣光在线一区| 欧美日韩亚洲高清| 97视频在线观看免费高清完整版在线观看| 国产精品99久久久久久白浆小说| 国产日韩欧美自拍| 欧美成人激情视频免费观看| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美中文日韩v在线观看| 中文字幕成人精品久久不卡| 国产激情久久久久| 日韩美女写真福利在线观看| 日本最新高清不卡中文字幕| 裸体女人亚洲精品一区| 亚洲视频999| 日韩一二三在线视频播| 韩剧1988免费观看全集| 国产视频精品在线| 久久久久中文字幕2018| 日韩av综合网| 精品中文字幕在线观看| 欧美国产亚洲视频| 国产精品观看在线亚洲人成网| 欧美日韩成人在线视频| 在线看日韩欧美| 国产欧美婷婷中文| 91av福利视频| 国产福利精品在线| 国产精品视频永久免费播放| 欧美日韩国产综合新一区| 欧美伊久线香蕉线新在线| 欧美日韩一区二区在线播放| 国产精品日韩久久久久| 精品国偷自产在线视频| 中文字幕亚洲图片| 国产精品福利片| 亚洲xxx自由成熟| 欧美二区在线播放| 国产亚洲精品久久| 插插插亚洲综合网| 日本a级片电影一区二区| 欧美大秀在线观看| 日韩毛片中文字幕| 日韩在线视频国产| 国产精品老女人精品视频| 国产精品99久久99久久久二8| 97视频在线观看亚洲| 久久青草精品视频免费观看| 亚洲一区二区中文字幕| 亚洲精品国产精品自产a区红杏吧| 国产日韩欧美日韩大片| 一夜七次郎国产精品亚洲| 一本一本久久a久久精品综合小说| 久久精品免费播放| 日韩av观看网址| 久久影视三级福利片| 欧美精品在线视频观看| 欧美日韩午夜激情| 日本人成精品视频在线| 国产午夜精品理论片a级探花| 日韩在线观看免费| 日韩精品中文字幕在线播放| 成人啪啪免费看| 国产亚洲精品久久久久久777| 久久777国产线看观看精品| 亚洲综合国产精品| 国产va免费精品高清在线观看| 欧美黑人狂野猛交老妇| 久久人人爽人人爽人人片av高请| 51午夜精品视频| 日韩精品视频免费在线观看| 国产精品视频999| 97色在线播放视频| 欧美在线性视频| 欧美成人精品在线播放| 久久久精品久久久| 亚洲国产精品嫩草影院久久| 中文字幕亚洲一区在线观看| 欧美疯狂性受xxxxx另类| 国产精品久久久久9999| 国产在线观看不卡| 久久国产精品久久久久久| 亚洲自拍偷拍区| 国产91九色视频| 91色在线视频| 8x拔播拔播x8国产精品| 中文字幕亚洲欧美| 国产精品一区二区三区免费视频| 亚洲欧洲美洲在线综合| 久久久免费电影| 国产精品夫妻激情| 欧洲日本亚洲国产区| 欧美精品做受xxx性少妇| 精品国产老师黑色丝袜高跟鞋| 欧洲美女7788成人免费视频| 精品久久久久久久久中文字幕| 亚洲精品永久免费精品| 国产一区二区三区免费视频| 亚洲精品成人av| 欧美人在线观看| 午夜精品www| 日韩av免费在线| 久久影院免费观看| 亚洲偷熟乱区亚洲香蕉av| 国产欧美久久一区二区| 欧美日韩一区二区在线播放| 国模吧一区二区三区| 欧美国产极速在线| 欧美精品videosex性欧美| 国产成人精品免费久久久久| 日韩在线免费视频| 2020国产精品视频| 91亚洲国产成人久久精品网站| 韩国国内大量揄拍精品视频| 国产a∨精品一区二区三区不卡| 欧美亚洲国产日韩2020| 国产一区二区三区18| 日本乱人伦a精品| 国产欧美日韩亚洲精品| 亚洲国产精品悠悠久久琪琪| 国产精品99久久99久久久二8| 奇门遁甲1982国语版免费观看高清| 久久天天躁狠狠躁夜夜爽蜜月| 欧美电影免费播放| 国内精品小视频在线观看| 日韩成人免费视频| 欧美日韩另类字幕中文| 日韩高清欧美高清| 精品美女久久久久久免费| 日韩av中文字幕在线| 国产日本欧美一区二区三区| 日韩av第一页| 国产精品色悠悠| 国产精品男人爽免费视频1| 成人伊人精品色xxxx视频| 日本精品久久电影| 91久久中文字幕| 日韩欧美aⅴ综合网站发布| 中文字幕视频在线免费欧美日韩综合在线看| 日韩经典中文字幕在线观看| 久久久久久国产| 成人精品视频在线| 国产日韩精品在线观看| 欧美视频13p| 91av在线免费观看视频| 欧美与欧洲交xxxx免费观看| 国产91对白在线播放| 亚洲人成五月天| 日韩av网站大全| 国产精品美女999| 亚洲电影免费在线观看| 国产成人在线视频| 九九久久国产精品| 欧美日韩亚洲精品内裤|