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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL中like查询是否会使用索引

發布時間:2023/12/20 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL中like查询是否会使用索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL中like查詢使用索引

  • explain查看執行計劃
  • 實驗過程
  • Like 不走索引的優化

explain查看執行計劃

首先介紹一下mysql explain的各項內容:

序號名稱含義備注
1id查詢的IDID相同從上往下執行,ID不同,越大越先執行
2select_type查詢類型SIMPLE 簡單查詢
PRIMARY 最外層的查詢
Union
SUBQUERY 子查詢。
還有很多類型可以看官方文檔 https://dev.mysql.com/doc/refman/5.6/en/explain-output.html
3table
4partitions匹配分區
5type連接類型system:表為空或只有一行
const:查詢結果就只有一行,這樣msql優化器就能把這一行當成常量處理,一般只有用主鍵/唯一索引查的時候出現
eq_ref:在當前表中只能找到一行與前面的查詢結果一一匹配,一般是用主鍵或惟一索引進行連接,用=符號
ref:在當前表中可以找到多行與前面的查詢結果一一匹配,一般是用主鍵的最左前綴或非唯一索引,用=, > , < 符號
full_text:用fulltext索引時使用
ref_null:和 ref很像,就是多搜索一個null條件
index_merge: 用到了不止一個索引,mysql做了優化
range:用于范圍查詢,包括like。Index:索引全表掃描;1.覆蓋索引,只需要掃描全部索引,無需回表;
ALL:全表掃描
6possible_keys可能選擇的索引
7key實際選擇的索引實際選擇的索引可能并不在possible_keys中,(這種情況是mysql發現你查的是個覆蓋索引,掃描索引比掃描全表要好)
8key_len選擇的索引的長度主要是聯合索引看看用到了多少
9ref與索引相比較的列const:用的常數
func:用的函數
10rows預估掃描行數
11filtered查詢條件過濾后占的百分比只對index和all類型的查詢生效,其他類型都為100%,可以看下這個文章http://blog.chinaunix.net/uid-20726500-id-5573764.html
12Extra額外信息介紹

實驗過程

  • 先建立一個表,如下圖所示
  • 在loacation_path添加索引后進行單條件,全部數據的查詢
    • like xxx%查詢
    explain select * from location where loaction_path like '中國%

    查詢結果

    可以看出ID為1 沒什么好說的,然后是simple的查詢,用到的表為location,分區為null,連接的類型是range(因為是用like查詢的),possible_keys為可以使用的location_path列上的索引,最終使用的也是這個key,key_length = 1020,這個是怎么算的呢?
    先看下表的列的類型和字符集:

    Location_path這一列是char(255),uft8mb4_0900_ai_ci正好對于每個字符用4個字節存儲:4*255 = 1020; 如果loation_path 允許為null,則還需要多一個字節存儲null,key_length會為1021,使用了索引進行查詢,掃描行數為6行,使用了索引。

    • like %xxx查詢
    explain select * from location where loaction_path like '%/浦東新區’


    這個則沒有使用索引

    • like %xxx%查詢
    explain select * from location where loaction_path like '%/上海市/%


    這個也沒有使用索引查詢

  • 分析
  • 如果前綴為%,索引不知道應該如何匹配,所以不會用到

  • 進行單條件,查詢單個屬性的查詢
  • explain select loaction_path from location where loaction_path like '%上海市%


    發現使用了索引,但是過濾的行數還是7行,possible_keys為空,也就是估計沒用索引,但是實際查詢時候發現是覆蓋索引的查詢,所以用上了。

    Like 不走索引的優化

  • 使用LOCATE
  • SELECT * FROM location WHERE LOCATE('上海市', location_path);

    benchmark對比如下:看起來查不了多少,基本上一樣(也可能和數據量有關系,畢竟表里面就幾條數據)

    總結

    以上是生活随笔為你收集整理的MySQL中like查询是否会使用索引的全部內容,希望文章能夠幫你解決所遇到的問題。

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