国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql中in會不會用索引

2024-07-24 12:32:50
字體:
來源:轉載
供稿:網友
  今天小編給大家分享一下mysql中in會不會用索引的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

  mysql中in是否會用索引的兩種情況:1、當in的取值范圍較小時,in會走索引;2、當in的取值范圍較大時,in不走索引,而是會用全表掃描。因為in的條件過多時,返回的數據就會很多,可能會導致應用堆內內存溢出,導致索引失效。
 
  本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
 
  結論:IN肯定會走索引,但是當IN的取值范圍較大時會導致索引失效,走全表掃描
 
  navicat可視化工具使用explain函數查看sql執行信息
 
  場景1:當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時,表示無法使用索引,必須盡快做優化。
 
  key:顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL
 
  rows: 顯示MySQL認為它執行查詢時必須檢查的行數。
 
  場景2:擴大IN中的取值范圍
 
  此時仍然走了索引,但是效率降低了
 
  場景3:繼續擴大IN的取值范圍
 
  發現此時已經沒有走索引了,而是全表掃描。
 
  在說一下結論
 
  結論:IN肯定會走索引,但是當IN的取值范圍較大時會導致索引失效,走全表掃描。
 
  By the way:如果使用了 not in,則不走索引。
 
  以上就是“mysql中in會不會用索引”這篇文章的所有內容,感謝各位的閱讀!
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛隆县| 隆林| 黄浦区| 黄冈市| 宜兰市| 荣昌县| 壤塘县| 鱼台县| 开原市| 靖安县| 叙永县| 平陆县| 郸城县| 阿克| 阳城县| 行唐县| 东乡| 叙永县| 思南县| 彭州市| 曲周县| 司法| 溆浦县| 诏安县| 高雄县| 健康| 新野县| 余江县| 重庆市| 嘉定区| 临湘市| 恭城| 湘西| 宁晋县| 资中县| 合阳县| 长岛县| 柞水县| 酒泉市| 新余市| 桂林市|