mysql中in會用索引嗎

WBOY
發布: 2022-05-27 15:43:06
原創
6582 人瀏覽過

mysql中in是否會用索引的兩種情況:1、當in的取值範圍較小時,in會走索引;2、當in的取值範圍較大時,in不走索引,而是會用全表掃描。因為in的條件過多時,傳回的資料就會很多,可能會導致應用程式堆內記憶體溢出,導致索引失效。

mysql中in會用索引嗎

本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。

mysql中in會用索引嗎

結論:IN一定會走索引,但是當IN的取值範圍較大時會導致索引失效,走全表掃描

navicat視覺化工具使用explain函數查看sql執行資訊

場景1:當IN中的取值只有一個主鍵時

mysql中in會用索引嗎

##我們只需要注意一個最重要的type 的資訊很明顯的提現是否用到索引:

type結果值從好到壞依序是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

all:全表掃描

index:另一種形式的全表掃描,只不過他的掃描方式是依照索引的順序

range:有範圍的索引掃描,相對於index的全表掃描,他有範圍限制,因此優於index

ref : 尋找條件列使用了索引而且不為主鍵和unique。其實,意思就是雖然使用了索引,但該索引列的值並不唯一,有重複。這樣即使使用索引快速查找到了第一條數據,仍然不能停止,要進行目標值附近的小範圍掃描。但它的好處是它並不需要掃全表,因為索引是有序的,即便有重複值,也是在一個非常小的範圍內掃描。

const:通常情況下,如果將一個主鍵放置到where後面作為條件查詢,mysql優化器就能把這次查詢優化轉化為一個常數。至於如何轉化以及何時轉化,這取決於優化器

一般來說,得保證查詢至少達到range級別,最好能達到ref,type出現index和all時,表示走的是全表掃描沒有走索引,效率低下,這時需要對sql進行調優。

當extra出現Using filesor或Using temproary時,表示無法使用索引,必須盡快做最佳化。

possible_keys:sql所使用的索引

key:顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL

rows: 顯示MySQL認為它執行查詢時必須檢查的行數。

場景2:擴大IN中的取值範圍

mysql中in會用索引嗎

#此時仍然走了索引,但是效率降低了

場景3 :繼續擴大IN的取值範圍

mysql中in會用索引嗎

看上面的圖,發現此時已經沒有走索引了,而是全表掃描。

在說結論

結論:IN一定會走索引,但是當IN的取值範圍較大時會導致索引失效,走全表掃描。

By the way:如果使用了 not in,則不走索引。

推薦學習:

mysql影片教學#

以上是mysql中in會用索引嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!