国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL中IN的取值范圍較大時會導致索引失效

這篇具有很好參考價值的文章主要介紹了MySQL中IN的取值范圍較大時會導致索引失效。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一:分析MySQL In查詢?yōu)槭裁此胁簧?/h2>

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

navicat可視化工具使用explain函數(shù)查看sql執(zhí)行信息

1.1 場景1:當IN中的取值只有一個主鍵時MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

我們只需要注意一個最重要的type 的信息很明顯的提現(xiàn)是否用到索引:

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

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

all:全表掃描

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

range:有范圍的索引掃描,相對于index的全表掃描,他有范圍限制,因此要優(yōu)于index

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

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

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

當extra出現(xiàn)Using filesor或Using temproary時,表示無法使用索引,必須盡快做優(yōu)化。

possible_keys:sql所用到的索引

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

rows: 顯示MySQL認為它執(zhí)行查詢時必須檢查的行數(shù)。

1.2 場景2:擴大IN中的取值范圍MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

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

1.3 場景3:繼續(xù)擴大IN的取值范圍

?MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

看上面的圖,發(fā)現(xiàn)此時已經(jīng)沒有走索引了,而是全表掃描。

在說一下結論

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

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

二:MySQL 需要 IN查詢但是很慢怎么辦???

從上文得知我們的IN查詢索引不生效,以及不生效的原因。

2.1 這是一個常用的IN查詢文章來源地址http://www.zghlxwxcb.cn/news/detail-618560.html


SELECT id, order_index, data_order_start, update_time, create_time, gov_frame_id 
FROM gov_price_category_detail 
WHERE 
gov_frame_id IN ( 
	SELECT id FROM gov_price_frame WHERE deleted=1 AND is_spider=0 AND city IN ( '長沙市' ) GROUP BY id 
) 
AND deleted=1 
AND data_order_start < 51 

MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql?

2.2 我們把IN查詢 改造成 inner 查詢


SELECT gcd.id,  gcd.order_index, gcd.data_order_start, gcd.update_time, gcd.create_time, gcd.gov_frame_id 
FROM gov_price_category_detail gcd , ( SELECT  gp.id FROM gov_price_frame gp WHERE  gp.deleted=1 AND  gp.is_spider=0 AND  gp.city IN ( '長沙市' ) GROUP BY  gp.id ) gpf
WHERE 
gpf.id = gcd.gov_frame_id
AND gcd.deleted=1 
AND gcd.data_order_start < 51 

MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql?

3.3 優(yōu)化后速度對比

原始SQL速度信息:?

MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

?優(yōu)化后SQL速度信息:

MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

?

一:分析MySQL In查詢?yōu)槭裁此胁簧?/h2>

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

navicat可視化工具使用explain函數(shù)查看sql執(zhí)行信息

1.1 場景1:當IN中的取值只有一個主鍵時MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

我們只需要注意一個最重要的type 的信息很明顯的提現(xiàn)是否用到索引:

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

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

all:全表掃描

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

range:有范圍的索引掃描,相對于index的全表掃描,他有范圍限制,因此要優(yōu)于index

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

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

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

當extra出現(xiàn)Using filesor或Using temproary時,表示無法使用索引,必須盡快做優(yōu)化。

possible_keys:sql所用到的索引

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

rows: 顯示MySQL認為它執(zhí)行查詢時必須檢查的行數(shù)。

1.2 場景2:擴大IN中的取值范圍MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

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

1.3 場景3:繼續(xù)擴大IN的取值范圍

?MySQL中IN的取值范圍較大時會導致索引失效,數(shù)據(jù)庫與mybatis,mysql

看上面的圖,發(fā)現(xiàn)此時已經(jīng)沒有走索引了,而是全表掃描。

在說一下結論

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

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

二:MySQL 需要 IN查詢但是很慢怎么辦???

從上文得知我們的IN查詢索引不生效,以及不生效的原因。

2.1 這是一個常用的IN查詢

到了這里,關于MySQL中IN的取值范圍較大時會導致索引失效的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 解決pandas的concat函數(shù)導致索引失效的方法

    解決pandas的concat函數(shù)導致索引失效的方法

    最近在寫數(shù)據(jù)的時候看到用一個concat函數(shù)進行整合,但是下面這段代碼之后就碰上個很奇怪的地方 這段代碼首先就是用dfs記錄了每一組數(shù)據(jù),最后使用concat函數(shù)進行連接。在這之后我希望在特定位置插入一列數(shù)據(jù) 一共有三種類型的文本,10條數(shù)據(jù),在df格式下前面也有索引。

    2024年02月11日
    瀏覽(33)
  • MySQL查詢條件OR導致模糊查詢失效

    起因:查出來的列表數(shù)據(jù),通過查詢條件過濾,發(fā)現(xiàn)過濾條件并不起作用 檢查發(fā)現(xiàn):where查詢條件里面有or的過濾條件,用來進行權限控制,模糊查詢條件本來是起效果的,但是OR的條件一執(zhí)行,就有多了些數(shù)據(jù) 代碼: 期望的結果:先查出來所有符合要求的,然后再根據(jù)過濾

    2024年01月22日
    瀏覽(36)
  • mysql 查詢優(yōu)化 、索引失效

    mysql 查詢優(yōu)化 、索引失效

    查詢優(yōu)化 物理查詢優(yōu)化 通過索引和表連接方式等技術來進行優(yōu)化,這里重點需要掌握索引的使用 邏輯查詢優(yōu)化 通過SQL 等價變換 提升查詢效率,直白一點就是說,換一種查詢寫法執(zhí)行效率可能更高 索引失效 計算、函數(shù)、類型轉換(自動或手動)導致索引失效 select sql_no_c

    2024年02月10日
    瀏覽(19)
  • MySQL 索引失效詳解

    一、MySQL索引失效原因匯總 隱式的類型轉換,索引失效 查詢條件包含or,可能導致索引失效 like通配符可能導致索引失效 查詢條件不滿足聯(lián)合索引的最左匹配原則 在索引列上使用mysql的內置函數(shù) 對索引進行列運算(如,+、-、*、/) 索引字段上使用 (! = 或者 ),索引可能失效 索

    2024年02月02日
    瀏覽(48)
  • MySQL索引失效的七大場景

    MySQL索引失效的七大場景

    模型數(shù)或運算快 這里我們以MySQL自帶的world數(shù)據(jù)庫中的country表為例。 向name列添加索引 查看country表索引 測試like完全匹配 可以看到type級別是index。索引失效。 在 MySQL 中,使用 EXPLAIN 語句可以查看查詢語句的執(zhí)行計劃,了解 MySQL 如何執(zhí)行查詢。其中,EXPLAIN 語句的結果集中的

    2023年04月22日
    瀏覽(22)
  • Mysql索引失效的場景分析

    前言: 日常使用Mysql做一些業(yè)務時,發(fā)現(xiàn)很慢,跟蹤日志返現(xiàn)是有慢查詢語句,于是使用explain查看執(zhí)行計劃發(fā)現(xiàn)是沒有使用到索引,一般這些情況都不是java框架導致的,一般框架里都會根據(jù)主鍵或者指定的條件去做簡單的查詢,復雜的查詢都是通過sql原生寫法來實現(xiàn)的,這

    2023年04月20日
    瀏覽(23)
  • Mysql中索引優(yōu)化和失效

    要了解索引優(yōu)化和索引失效的場景就要先了解什么是索引 索引是一種有序的存儲結構,按照單個或者多個列的值進行排序,以提升搜索效率。 索引的類型 UNIQUE唯一索引 不可以出現(xiàn)相同的值,可以有NULL值。 INDEX普通索引 允許出現(xiàn)相同的索引內容。 PRIMARY KEY主鍵索引 不允許出

    2024年02月20日
    瀏覽(31)
  • 第20章:MySQL索引失效案例

    第20章:MySQL索引失效案例

    1. 全值匹配我最愛 當SQL查詢 創(chuàng)建3個索引 當前優(yōu)化器會選擇跟where條件匹配最高的idx_age_classid_name索引,直接查詢出對應的主鍵值然后回表查詢,此時的效率最高。所以部分索引失效,因為使用的部分索引,會查詢多個主鍵值還需要回表繼續(xù)判斷,效率低。 2. 最佳左前綴規(guī)則

    2024年02月11日
    瀏覽(19)
  • 詳解MySQL索引失效的幾種情況

    詳解MySQL索引失效的幾種情況

    MySQL索引是提高查詢效率的重要手段。索引失效會導致查詢效率下降,甚至全表掃描,影響數(shù)據(jù)庫性能。以下是可能導致MySQL索引失效的情況: 當where語句中使用 or 操作符并且 or 兩邊的條件涉及到至少兩個字段時,MySQL無法使用索引,會轉向全表掃描。因此,應盡量避免使用

    2024年02月01日
    瀏覽(21)
  • MySQL索引3——Explain關鍵字和索引優(yōu)化(SQL提示、索引失效、索引使用規(guī)則)

    MySQL索引3——Explain關鍵字和索引優(yōu)化(SQL提示、索引失效、索引使用規(guī)則)

    目錄 Explain 索引性能分析 Id ——select的查詢序列號 Select_type——select查詢的類型 Table——表名稱 Type——select的連接類型 Possible_key ——顯示可能應用在這張表的索引 Key——實際用到的索引 Key_len——實際索引使用到的字節(jié)數(shù) Ref??? ——索引命中的列或常量 Rows——預

    2024年02月14日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包