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

MySQL的OR條件查詢不走索引及解決方案

 更新時(shí)間:2025年10月09日 09:45:34   作者:程序新視界  
今天這篇文章我們來簡單介紹一下MySQL的OR條件查詢,以及它可能會(huì)引發(fā)的索引失效的場(chǎng)景以及解決方案,方便大家在實(shí)踐中,具有一定的參考價(jià)值,感興趣的可以了解一下

今天這篇文章我們來簡單介紹一下MySQL的OR條件查詢,以及它可能會(huì)引發(fā)的索引失效(即不走索引)的場(chǎng)景以及解決方案。方便大家在實(shí)踐中,留意是否正確使用了OR條件查詢。

MySQL的OR條件查詢簡介

在 MySQL 中,OR 條件查詢是一種利用 OR 邏輯操作符在 WHERE 子句中連接多個(gè)條件的查詢方式。當(dāng)查詢中使用 OR 操作符時(shí),只要其中任何一個(gè)條件滿足就會(huì)返回對(duì)應(yīng)的數(shù)據(jù)行。它是一種常見的邏輯運(yùn)算,用于實(shí)現(xiàn)靈活的數(shù)據(jù)篩選。

OR條件查詢經(jīng)常用于:多字段查詢、聯(lián)合范圍查詢、動(dòng)態(tài)篩選等場(chǎng)景。

多字段查詢示例:

SELECT * FROM users 
WHERE name = 'Alice' OR city = 'Chicago';

聯(lián)合范圍查詢示例:

SELECT * FROM users
WHERE age < 30 OR age > 35;

動(dòng)態(tài)篩選示例:

SELECT * FROM orders
WHERE status = 'pending' OR status = 'processing';

其中,在多字段查詢的場(chǎng)景下,需要特別留意是否會(huì)出現(xiàn)不走索引的情況,下面我們來詳細(xì)介紹一下這種情況及解決方案。

不走索引案例分析

如果查詢條件中包含 OR 操作符,通常情況下,即使其中一個(gè)條件是基于索引的,MySQL 也可能不會(huì)使用該索引,轉(zhuǎn)而執(zhí)行全表掃描(Table Scan)。

原因:MySQL 查詢優(yōu)化器無法高效地利用索引來處理 OR 條件,尤其是在多個(gè)條件中一個(gè)或多個(gè)字段沒有索引的情況下。

推薦操作:盡量避免使用 OR,可以通過 UNION ALLUNION 來重構(gòu)查詢邏輯,從而強(qiáng)制使用索引。

案例分析

假設(shè)有一個(gè)表 example_table,結(jié)構(gòu)如下:

CREATE TABLE example_table (
    id INT NOT NULL,                  -- 有索引字段
    name VARCHAR(100),                -- 沒有索引字段
    age INT,                          -- 有索引字段
    PRIMARY KEY (id),                 -- 主鍵索引
    INDEX index_age (age)             -- 輔助索引
);

插入一些測(cè)試數(shù)據(jù):

INSERT INTO example_table (id, name, age) VALUES 
(1, 'Alice', 30),
(2, 'Bob', 25),
(3, 'Charlie', 35),
(4, 'Dave', 40);

使用OR條件的查詢:

mysql> EXPLAIN SELECT * FROM example_table  WHERE id = 1 OR name = 'Alice' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: example_table
   partitions: NULL
         type: ALL
possible_keys: PRIMARY
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
     filtered: 43.75
        Extra: Using where

分析:

  • id = 1 是主鍵查詢,本應(yīng)該使用索引 PRIMARY。
  • 但是,由于包含 OR 條件 name = 'Alice',而 name 列沒有索引,MySQL 的優(yōu)化器選擇了不使用索引而執(zhí)行全表掃描。
  • 最終結(jié)果:查詢執(zhí)行了全表掃描 (type: ALL)。

解決方案

方法 1:使用UNION替代OR

將原查詢拆分,并通過 UNION 分別處理有索引和無索引的條件,從而強(qiáng)制使用索引:

mysql> EXPLAIN SELECT * FROM example_table WHERE id = 1
    -> UNION ALL
    -> SELECT * FROM example_table WHERE name = 'Alice' \G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: example_table
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 2. row ***************************
           id: 2
  select_type: UNION
        table: example_table
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
     filtered: 25.00
        Extra: Using where

通過執(zhí)行計(jì)劃可以看出,對(duì)于第一部分查詢使用了索引,對(duì)于第二部分查詢使用全表掃描,因?yàn)?code>name字段無索引。雖然仍有一部分未使用索引,但數(shù)據(jù)量較大的情況下,這種分拆方式對(duì)性能更優(yōu)。

方法 2:添加索引優(yōu)化

如果查詢中經(jīng)常根據(jù) name 條件篩選數(shù)據(jù),可以考慮為 name 列添加索引:

mysql> ALTER TABLE example_table ADD INDEX index_name (name);
?
mysql> explain SELECT * FROM example_table WHERE id = 1 OR name = 'Alice' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: example_table
   partitions: NULL
         type: index_merge
possible_keys: PRIMARY,index_name
          key: PRIMARY,index_name
      key_len: 4,403
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using union(PRIMARY,index_name); Using where

針對(duì)name列添加索引之后,MySQL 使用了 index_merge 查詢優(yōu)化策略,結(jié)合主鍵索引和輔助索引 index_name。數(shù)據(jù)量較大的時(shí)候,這種方式可以顯著加速查詢,避免全表掃描。

總結(jié)規(guī)則

第一、一般規(guī)則:

  • 查詢條件使用 OR 且部分字段沒有索引時(shí),MySQL 很可能會(huì)選擇執(zhí)行全表掃描,而不是使用索引。
  • MySQL 的查詢優(yōu)化器在處理 OR 時(shí)效率較差。

第二、優(yōu)化建議:

  • 盡量避免使用 OR,使用 UNION ALLUNION 替代。
  • 根據(jù)查詢條件頻率,合理為字段創(chuàng)建索引。
  • 如果數(shù)據(jù)復(fù)雜,可以通過改寫查詢邏輯,分拆條件使得索引能被充分使用。

第三、特別注意:

  • OR 可能導(dǎo)致索引失效的情況對(duì)于大數(shù)據(jù)量的表尤為關(guān)鍵,因?yàn)槿頀呙璧男阅艽鷥r(jià)在數(shù)據(jù)量增加時(shí)會(huì)嚴(yán)重影響查詢速度。

到此這篇關(guān)于MySQL的OR條件查詢不走索引及解決方案的文章就介紹到這了,更多相關(guān)MySQL OR條件查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • MySQL日志系統(tǒng)之錯(cuò)誤日志、慢查詢?nèi)罩?、二進(jìn)制日志詳解

    MySQL日志系統(tǒng)之錯(cuò)誤日志、慢查詢?nèi)罩?、二進(jìn)制日志詳解

    MySQL日志系統(tǒng)是數(shù)據(jù)庫管理的重要組成部分,它幫助數(shù)據(jù)庫管理員監(jiān)控?cái)?shù)據(jù)庫活動(dòng)、優(yōu)化查詢、恢復(fù)數(shù)據(jù)以及診斷問題,這篇文章主要介紹了MySQL日志系統(tǒng)之錯(cuò)誤日志、慢查詢?nèi)罩?、二進(jìn)制日志的相關(guān)資料,需要的朋友可以參考下
    2025-05-05
  • MySQL索引優(yōu)化指南之如何科學(xué)為數(shù)據(jù)表添加索引

    MySQL索引優(yōu)化指南之如何科學(xué)為數(shù)據(jù)表添加索引

    在數(shù)據(jù)庫優(yōu)化中,索引(Index)是最常用的性能優(yōu)化手段之一,正確的索引可以大幅提升查詢速度,本文小編就來和大家講講如何為數(shù)據(jù)表科學(xué)添加索引吧
    2025-05-05
  • mysql主從復(fù)制配置過程

    mysql主從復(fù)制配置過程

    網(wǎng)站面臨大流量的情況下,數(shù)據(jù)庫讀寫成了性能瓶頸。除了使用多級(jí)緩存外,進(jìn)行數(shù)據(jù)讀寫分離,也是提高網(wǎng)站承載能力重要的手段。本文介紹mysql讀寫分離、mysql主從復(fù)制配置過程。
    2020-09-09
  • MySQL 使用 Performance Schema 定位和解決慢 SQL 問題

    MySQL 使用 Performance Schema 定位和解決慢 

    本文介紹了如何使用MySQL的PerformanceSchema來定位和解決慢SQL查詢問題,通過啟用PerformanceSchema并分析相關(guān)的系統(tǒng)表,可以收集到詳細(xì)的性能數(shù)據(jù),從而識(shí)別出影響性能的SQL語句,優(yōu)化策略包括優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置等
    2025-02-02
  • MySQL安全輸入密碼的一些操作介紹

    MySQL安全輸入密碼的一些操作介紹

    這篇文章主要介紹了MySQL安全輸入密碼的一些操作,示例基于Linux操作系統(tǒng),需要的朋友可以參考下
    2015-07-07
  • MySQL 實(shí)用命令

    MySQL 實(shí)用命令

    對(duì)于剛接觸到mysql的朋友,需要的了解下,mysql的一些小技巧。
    2009-03-03
  • MySQL在哪些情況下不使用索引的示例

    MySQL在哪些情況下不使用索引的示例

    盡管索引可以顯著提高數(shù)據(jù)庫的查詢性能,但在某些情況下,MySQL可能不會(huì)使用索引,本文就來介紹一下MySQL在哪些情況下不使用索引,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • MYSQL主從庫不同步故障一例解決方法

    MYSQL主從庫不同步故障一例解決方法

    第一次做完主從庫同步后正常,但工作過程中發(fā)現(xiàn)有一個(gè)庫的數(shù)據(jù)庫沒有同步起來,在另外一個(gè)mysql(3307)中
    2010-06-06
  • 大數(shù)據(jù)小內(nèi)存排序問題如何巧妙解決

    大數(shù)據(jù)小內(nèi)存排序問題如何巧妙解決

    文章介紹了大數(shù)據(jù)小內(nèi)存排序的三種方法:數(shù)據(jù)庫排序、分治法和位圖法,數(shù)據(jù)庫排序簡單但速度慢,對(duì)設(shè)備要求高;分治法高效但實(shí)現(xiàn)復(fù)雜;位圖法可讀性差,但存儲(chǔ)空間受限
    2025-01-01
  • 解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_date'?column

    解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_d

    這篇文章主要介紹了解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_date'?column問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

庆云县| 盖州市| 长阳| 正定县| 津南区| 盐边县| 竹山县| 安新县| 肇庆市| 乐东| 永川市| 霞浦县| 东丽区| 巫溪县| 杭锦后旗| 台东市| 扎赉特旗| 大同县| 齐河县| 元阳县| 台安县| 建阳市| 宁远县| 香港 | 鸡泽县| 娄底市| 镇巴县| 肃宁县| 确山县| 岑溪市| 师宗县| 巴青县| 聂拉木县| 河南省| 兖州市| 长武县| 马关县| 高青县| 冷水江市| 交口县| 高碑店市|