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

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

 更新時間:2023年06月12日 10:35:34   作者:JavaLearn-  
索引并不是時時都會生效的,在一起情況下將導(dǎo)致索引失效,這篇文章主要給大家介紹了關(guān)于MySQL索引失效的幾種情況,文章通過圖文介紹的非常詳細,需要的朋友可以參考下

MySQL索引是提高查詢效率的重要手段。索引失效會導(dǎo)致查詢效率下降,甚至全表掃描,影響數(shù)據(jù)庫性能。以下是可能導(dǎo)致MySQL索引失效的情況:

1. 使用or操作符

當where語句中使用or操作符并且or兩邊的條件涉及到至少兩個字段時,MySQL無法使用索引,會轉(zhuǎn)向全表掃描。因此,應(yīng)盡量避免使用or操作符。

原因:因為MySQL中的索引是根據(jù)某個字段進行排序建立的。當使用or操作符,說明有兩個條件其中某個條件成立即可,而我們使用某個索引時只能判斷出對應(yīng)字段的條件是否成立,即使不成立,另一個條件成立時該記錄也符合我們要查詢的結(jié)果。所以使用索引無法做出判斷。

例:

-- id為主鍵索引
EXPLAIN SELECT * FROM test WHERE id > 1 OR `name` = 'zs';

可以看出type為ALL:全表掃描

EXPLAIN SELECT * FROM test WHERE id > 3 OR id < 1;

可以看出type為PRIMARY:使用了主鍵索引;

2. 復(fù)合索引失效

如果使用了復(fù)合索引,但查詢時未使用索引的第一列,索引也會失效。

原因:比如我們根據(jù)字段(t1,t2,t3)建立了復(fù)合索引,則排序規(guī)則是先按t1字段進行排序,t1字段相同再按t2字段排序,當t1、t2字段都相同時再按t3字段進行排序。如果我們的查詢條件中沒有使用到第一列,那么該索引也就沒有辦法使用。

例:

-- t1、t2列建立了符合索引
EXPLAIN SELECT * FROM test WHERE t1 = '1' AND t2 = '2';

可以看出type為ref:使用了二級索引;(當使用二級索引列于常數(shù)進行等值比較時,訪問方法為ref)

-- 未使用索引的第一列t1
EXPLAIN SELECT * FROM test WHERE t2 = '1';

可以看出type為ALL:全表掃描

3. like查詢

如果使用了like且以%開頭,則索引會失效。

原因:模糊查詢一般用在字符串的字段上,而字符串的排序規(guī)則為按字母字典序排序,如果以%開頭,表示前面的字符取啥都行,則無法使用索引。

例:

EXPLAIN SELECT * FROM test WHERE t1 LIKE '1%';

可以看出type為range:使用二級索引進行范圍查詢。

EXPLAIN SELECT * FROM test WHERE t1 LIKE '%1';

可以看出type為ALL:全表掃描

4. 索引列上使用函數(shù)

原因:因為索引保存的是索引字段的原始值,而不是經(jīng)過函數(shù)計算后的值,自然就沒辦法走索引了。

explain select * from test where length(t1) = 2;

5. 隱式類型轉(zhuǎn)換

隱式類型轉(zhuǎn)換規(guī)則:

  1. 如果一個或兩個參數(shù)都是NULL,比較的結(jié)果是NULL,除了安全的<=>相等比較運算符。對于NULL <=> NULL,結(jié)果為true。不需要轉(zhuǎn)換。
  2. 如果比較操作中的兩個參數(shù)都是字符串,則將它們作為字符串進行比較。
  3. 如果兩個參數(shù)都是整數(shù),則將它們作為整數(shù)進行比較。
  4. 十六進制值如果不與數(shù)字進行比較,則被視為二進制字符串。
  5. 如果其中一個參數(shù)是十進制值,則比較取決于另一個參數(shù)。 如果另一個參數(shù)是十進制或整數(shù)值,則將參數(shù)與十進制值進行比較,如果另一個參數(shù)是浮點值,則將參數(shù)作為浮點值進行比較(但沒有將整數(shù)類型轉(zhuǎn)換為浮點類型)。
  6. 如果其中一個參數(shù)是TIMESTAMP或DATETIME列,另一個參數(shù)是常量,則在執(zhí)行比較之前將常量轉(zhuǎn)換為時間戳。
  7. 在所有其他情況下,參數(shù)都是作為浮點數(shù)(雙精度)比較的。

隱式類型轉(zhuǎn)換會導(dǎo)致索引失效,比如當字段類型為字符串且建有索引,而查詢條件類型為數(shù)值時,會將字符串類型隱式轉(zhuǎn)換為浮點型,此時索引會失效。

原因:字符串類型轉(zhuǎn)換為浮點數(shù)會使用cast函數(shù),此時索引列上使用函數(shù),導(dǎo)致索引失效。

EXPLAIN SELECT * FROM test WHERE t1 = 1.1;

6. 對索引進行表達式計算

原因:因為索引保存的是索引字段的原始值,而不是 id + 1 表達式計算后的值,所以無法走索引,只能通過把索引字段的取值取出來,然后進行表達式的計算來進行條件判斷,因此采用的就是全表掃描的方式。

-- num字段有二級索引
EXPLAIN SELECT * FROM test WHERE num = 1 + 10;

EXPLAIN SELECT * FROM test WHERE num + 1 = 10;

補充知識:索引設(shè)計建議

優(yōu)先使用唯一索引,能夠快速定位

為常用查詢字段建索引

為排序、分組和聯(lián)合查詢字段建索引

一張表的索引數(shù)量不超過5個

表數(shù)據(jù)量少,可以不用建索引

盡量使用占用空間小的字段建索引

用idx_或unx_等前綴命名索引,方面查找

刪除沒用的索引,因為它會占一定空間

總結(jié) 

到此這篇關(guān)于MySQL索引失效的幾種情況的文章就介紹到這了,更多相關(guān)MySQL索引失效情況內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程

    Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程

    這篇文章主要介紹了Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程,需要的朋友可以參考下
    2017-01-01
  • 實現(xiàn)MySQL與elasticsearch的數(shù)據(jù)同步的代碼示例

    實現(xiàn)MySQL與elasticsearch的數(shù)據(jù)同步的代碼示例

    MySQL 自身簡單、高效、可靠,是又拍云內(nèi)部使用最廣泛的數(shù)據(jù)庫,但是當數(shù)據(jù)量達到一定程度的時候,對整個 MySQL 的操作會變得非常遲緩,這個時候我們就需要MySQL與elasticsearch數(shù)據(jù)同步,接下來就給大家介紹如何實現(xiàn)數(shù)據(jù)同步
    2023-07-07
  • 清理MySQL Binlog二進制日志的三種方式

    清理MySQL Binlog二進制日志的三種方式

    Binlog日志非常重要,但是占用的磁盤空間也很大,我們也需要定期的去清理二進制日志,在MySQL數(shù)據(jù)庫中,提供了自動清理Binlog日志的參數(shù),本文給大家介紹了清理MySQL Binlog二進制日志的三種方式,文中通過代碼講解非常詳細,需要的朋友可以參考下
    2024-01-01
  • MySQL開啟記錄執(zhí)行過的SQL語句方法

    MySQL開啟記錄執(zhí)行過的SQL語句方法

    這篇文章主要介紹了MySQL開啟記錄執(zhí)行過的SQL語句方法,配置的方法很簡單,本文直接給出配置示例,需要的朋友可以參考下
    2015-07-07
  • 深入mysql基礎(chǔ)知識的詳解

    深入mysql基礎(chǔ)知識的詳解

    本篇文章是對mysql基礎(chǔ)知識進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • MySql中表的復(fù)合查詢實現(xiàn)示例

    MySql中表的復(fù)合查詢實現(xiàn)示例

    在MySQL中,復(fù)合查詢是對多張表進行查詢的操作,包括多表查詢、自連接、子查詢等,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • mysql查詢鎖表的實現(xiàn)方法

    mysql查詢鎖表的實現(xiàn)方法

    本文主要介紹了mysql查詢鎖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • MySQL執(zhí)行狀態(tài)查看與分析過程

    MySQL執(zhí)行狀態(tài)查看與分析過程

    這篇文章主要介紹了MySQL執(zhí)行狀態(tài)查看與分析過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • 一條SQL更新語句的執(zhí)行過程解析

    一條SQL更新語句的執(zhí)行過程解析

    這篇文章主要介紹了一條SQL更新語句的執(zhí)行過程解析,所以一條更新語句的執(zhí)行流程又是怎樣的呢?下面我們一起進入文章了解更多具體內(nèi)容吧
    2022-05-05
  • mysql清空表數(shù)據(jù)的兩種方式和區(qū)別解析

    mysql清空表數(shù)據(jù)的兩種方式和區(qū)別解析

    這篇文章主要介紹了mysql清空表數(shù)據(jù)的兩種方式和區(qū)別,本文通過文字實例代碼相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

连平县| 铁岭市| 安达市| 驻马店市| 郁南县| 来凤县| 孝昌县| 池州市| 乌拉特后旗| 蓝山县| 防城港市| 汕尾市| 南京市| 麦盖提县| 股票| 惠水县| 资中县| 达拉特旗| 环江| 成都市| 宁安市| 金阳县| 阳信县| 响水县| 三台县| 环江| 赣州市| 综艺| 封丘县| 金川县| 玉田县| 七台河市| 城口县| 同仁县| 临泉县| 宜君县| 大名县| 绥中县| 太仓市| 金寨县| 德清县|