最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的聯(lián)合索引范圍條件失效問題解決辦法

 更新時間:2026年04月23日 09:48:46   作者:Famiglistimo_123  
在數(shù)據(jù)庫優(yōu)化中,索引是一項(xiàng)至關(guān)重要的技術(shù)手段,可以顯著提升查詢性能,下面這篇文章主要介紹了MySQL的聯(lián)合索引范圍條件失效問題解決的相關(guān)資料,文中介紹的非常非常詳細(xì),需要的朋友可以參考下

聯(lián)合索引的排序邏輯:

  • 聯(lián)合索引是多列組合的索引(如 idx(a, b, c)),其底層 B + 樹的排序規(guī)則是:先按列 a 排序 → a 值相同的行,再按列 b 排序 → a 和 b 都相同的行,最后按列 c 排序??梢岳斫鉃椋核饕龢涫?“先按第一把鑰匙排序,第一把相同再按第二把,以此類推”。

非等值的范圍條件:

  • 常見操作符:>、<、between、like '%xx'(注意:in 是 “等值多值查詢”,不算范圍條件;>=、<= 雖屬于范圍,但本質(zhì)是 “包含邊界的 「 等值 」 延伸”,優(yōu)化器更易利用)。

范圍條件對索引的影響:

  • 聯(lián)合索引的 “可用性” 依賴于 前綴列的有序性 —— 只有前一列是 “等值匹配” 時,后一列的索引排序才有意義。一旦某一列用了 “非等值范圍條件”,其右側(cè)所有列的索引排序會直接 “混亂”,優(yōu)化器會放棄使用這些右側(cè)列的索引部分。

舉例

假設(shè)數(shù)據(jù)如下:

(name='張三', age=20, score=85)
(name='張三', age=20, score=90)
(name='張三', age=22, score=80)
(name='李四', age=19, score=95)
(name='李四', age=21, score=88)

情況一:

select * from student where name='張三' and age=20 and score=90;
  • 邏輯:先通過 name='張三'(等值)定位到前 3 行 → 再通過 age=20(等值)定位到前 2 行 → 最后通過 score=90(等值)精準(zhǔn)命中目標(biāo)行。
  • 結(jié)論:索引 idx(name, age, score) 全列有效。

情況二:

select * from student where name='張三' and age>20 and score=80;
  • 邏輯:name='張三'(等值)定位到前 3 行 → age>20(非等值范圍條件)篩選出 age=22 的 1 行(此時,age>20 的部分中,score 沒有有序性可言 —— 因?yàn)槿绻懈鄶?shù)據(jù),age=23score 可能是 70,age=24score 可能是 90,完全無序)。
  • 結(jié)論:score 列的索引失效,優(yōu)化器只能用 nameage 的索引,score=80 需在篩選后的結(jié)果中 “逐行判斷”(無法利用索引快速查找)。

情況三:

select * from student where name='張三' and age>20 and score=80;
  • 邏輯:同情況 2,age 是范圍列,其右側(cè)的 score 索引失效。

為輔助理解,這里補(bǔ)充說明:若查詢條件為where name='張三' and age>=20,age>20的部分索引仍會失效,只有age=20的部分查找時可以用到索引。

總結(jié)

>=、<= 能保留 “前綴等值部分的有序性”,而 >、< 會破壞邊界的等值連續(xù)性,導(dǎo)致索引選擇性更差,甚至完全失效。盡量使用大于等于(>=)或小于等于(<=)。

注意事項(xiàng)補(bǔ)充

  1. 單列索引無此問題:只有聯(lián)合索引才有 “左側(cè) / 右側(cè)列” 的概念,單列索引無論用 >、< 還是 >=、<=,都能正常利用索引;
  2. in 不算非等值范圍條件in 是 “等值多值查詢”,比如 name in ('張三', '李四') and age=20,age 仍能利用索引(因?yàn)?name 雖多值但仍是等值匹配,age 排序有效);
  3. 范圍列盡量放聯(lián)合索引右側(cè):設(shè)計聯(lián)合索引時,若一定要用到非等值范圍條件,應(yīng)將用非等值范圍條件的列放在最后,避免影響左側(cè)列的索引可用性;
  4. 覆蓋索引可緩解失效影響:如果查詢的列都在聯(lián)合索引中(如 select name, age, score from ...),即使右側(cè)列失效,優(yōu)化器仍會用 “索引全掃描”(無需回表),效率依然高于全表掃描。

聯(lián)合索引中,什么時候索引是有效的,什么時候所以是無效的?

注意:是不是使用索引,和查詢條件的順序無關(guān)(優(yōu)化器會自動調(diào)整條件的順序),但和這些字段的查詢手段有關(guān)

例子:建立了abc的聯(lián)合索引,相當(dāng)于建立了 a的單列索引,ab的聯(lián)合索引,以及abc的聯(lián)合索引

情況一:模糊查詢生效失效的情況

一般根據(jù)最左匹配的原則,但在遇到范圍查詢后,匹配終止,也就是說,當(dāng)條件為:

a like ‘%str%’ 或者 a like ‘%str’ 時,不走索引;

當(dāng)條件為 a like ‘str%’ 或者 “>”, “<”, "between"時, 僅使用了聯(lián)合索引中a的部分

b,c 同理,根據(jù)查詢方式不同,即便條件中的3個字段都在索引里,也不一定使用了全索引

假如條件是 a = 1 and b = 2 and c = 3 這類情況,是必然走這個聯(lián)合索引了

情況二:a% and b的情況

b不走索引但走索引下推(b走了索引下推,減少了回表次數(shù)。。。。。如果b沒有索引下推,則還要在a%回表后進(jìn)行一次b篩選)

B是不走索引的話:

首先A%會走索引的進(jìn)行模糊查詢,將模糊查詢出來的主鍵進(jìn)行回表(如果覆蓋索引就不需要回表),回表后再根據(jù)B進(jìn)行篩選,這時候B是不走索引的
B使用索引下推的話:

首先A%會走索引的進(jìn)行模糊查詢,模糊查詢結(jié)束的時候,會將B條件索引下推到存儲引擎層,這時候會從模糊查詢的結(jié)果中篩選出來符合B的。最后再回表查詢對應(yīng)的字段(如果覆蓋索引就不需要回表)。減少了回表的次數(shù)。

到此這篇關(guān)于MySQL的聯(lián)合索引范圍條件失效問題解決辦法的文章就介紹到這了,更多相關(guān)MySQL聯(lián)合索引范圍條件失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL徹底禁止用戶執(zhí)行KILL的解決方法

    MySQL徹底禁止用戶執(zhí)行KILL的解決方法

    在?MySQL?中,即使用戶只有?SELECT?權(quán)限,仍然可以執(zhí)行?SHOW?PROCESSLIST?和?KILL?命令,那么如何徹底禁止用戶執(zhí)行?KILL?本文給大家詳細(xì)介紹了MySQL徹底禁止用戶執(zhí)行KILL的解決方法,需要的朋友可以參考下
    2025-05-05
  • mysql報錯RSA?private?key?file?not?found的解決方法

    mysql報錯RSA?private?key?file?not?found的解決方法

    當(dāng)MySQL報錯RSA?private?key?file?not?found時,可能是由于MySQL的RSA私鑰文件丟失或者損壞導(dǎo)致的,此時可以重新生成RSA私鑰文件,以解決這個問題
    2023-06-06
  • mysql中異常錯誤ERROR:2002的解決方法

    mysql中異常錯誤ERROR:2002的解決方法

    最近在啟動mysql的時候發(fā)現(xiàn)mysql報錯了,錯誤代碼是2002,通過查找相關(guān)的資料發(fā)現(xiàn)是var/lib/mysql 的訪問權(quán)限問題,所以這篇文章主要介紹了mysql中異常錯誤ERROR:2002的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • MYSQL事務(wù)回滾的2個問題分析

    MYSQL事務(wù)回滾的2個問題分析

    在事務(wù)中,每個正確的原子操作都會被順序執(zhí)行,直到遇到錯誤的原子操作,此時事務(wù)會將之前的操作進(jìn)行回滾?;貪L的意思是如果之前是插入操作,那么會執(zhí)行刪 除插入的記錄,如果之前是update操作,也會執(zhí)行update操作將之前的記錄還原
    2014-05-05
  • MySQL root密碼的重置方法

    MySQL root密碼的重置方法

    這篇文章主要介紹了MySQL root密碼的重置方法,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • Mysql數(shù)據(jù)庫表定期備份的實(shí)現(xiàn)詳解

    Mysql數(shù)據(jù)庫表定期備份的實(shí)現(xiàn)詳解

    這篇文章主要介紹了Mysql數(shù)據(jù)庫表定期備份的實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • winx64下mysql5.7.19的基本安裝流程(詳細(xì))

    winx64下mysql5.7.19的基本安裝流程(詳細(xì))

    這篇文章主要介紹了winx64下mysql5.7.19的基本安裝流程,需要的朋友可以參考下
    2017-10-10
  • mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù)示例

    mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù)示例

    這篇文章主要介紹了mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù),涉及mysql查詢相關(guān)的時間轉(zhuǎn)換、排序等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯誤的解決辦法

    MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has

    這篇文章主要給大家介紹了MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯誤的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 淺談開啟magic_quote_gpc后的sql注入攻擊與防范

    淺談開啟magic_quote_gpc后的sql注入攻擊與防范

    通過啟用php.ini配置文件中的相關(guān)選項(xiàng),就可以將大部分想利用SQL注入漏洞的駭客拒絕于門外
    2012-01-01

最新評論

长顺县| 铜梁县| 泰顺县| 兰考县| 鄂尔多斯市| 平湖市| 营口市| 新郑市| 从化市| 大丰市| 樟树市| 泊头市| 府谷县| 福鼎市| 岳普湖县| 清远市| 会昌县| 霍林郭勒市| 云安县| 老河口市| 清丰县| 漳浦县| 宽甸| 淅川县| 宁城县| 潮州市| 横山县| 收藏| 洛南县| 青浦区| 石首市| 塘沽区| 吉安市| 金门县| 江都市| 金坛市| 谷城县| 苍山县| 翁源县| 登封市| 潜山县|