MySQL 有多個普通索引時會取哪一個索引?

我們都知道MySQL在查詢時底層會進行索引的優化,假設有兩個普通索引,且where 后面也根據這兩個普通索引查詢數據,那么執行查詢語句時會使用到那個索引?

為了方便演示,新建users表,新建idx_name、idx_city這兩個普通索引如下:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50) ,age INT,city VARCHAR(50) ,INDEX idx_name (name),INDEX idx_city (city)
) DEFAULT CHARSET=utf8mb4i;
INSERT INTO users (id, name, age, city)
VALUES(1, '張三', 25, '北京'),(2, '李四', 30, '上海'),(3, '王五', 40, '廣州'),(4, '趙六', 35, '深圳'),(5, '張三', 28, '上海');

1)根據單個索引查詢

根據name 查詢數據時,如下圖key = idx_name ,即走了idx_name的索引

explain select * from users where name = '張三';

image-20231124223736971

根據city查詢數據時,如下圖key = idx_city ,即走了idx_city的索引

image-20231124223934641

2)根據多個普通索引查詢

示例1:

根據name和city查詢,并且name和city能夠定位到一條數據

explain select * from users where name = '張三' and city = '上海';

image-20231124224604957

即使沒有復合索引,優化器也可以選擇使用索引合并策略。它可以使用 idx_name 索引定位滿足 name = '張三' 的行,然后使用 idx_city 索引在之前的結果集上進行進一步篩選,以滿足 city = '上海' 的條件。

示例2:

根據name和city查詢,并且單獨查詢name時,name = ‘張三’ 有兩條記錄,單獨查詢city時,city=‘廣州’ 有一條記錄

explain select * from users where name = '張三' and city = '廣州';

image-20231124225014062

此時優化器會走idx_city索引,這是因為如果走idx_name索引要查詢兩次,根據idx_city一次查詢就能定位到具體的數據,因此此處優化器采用idx_city作為索引。

同樣執行如下SQL也是走的idx_city的索引,因為city='北京’的記錄只有一條

explain select * from users where name = '張三' and city = '北京';

再來看看下面的這個SQL語句,會走那個索引呢?

explain select * from users where name = '李四' and city = '上海';

image-20231124225751394

如上圖,當根據name = '李四’查詢出來數據只有一條、city='上海’有兩條數據,最終結果走的是idx_name索引

示例3:

explain select * from users where   city = '廣州' and name = '趙六';explain select * from users where name = '趙六' and city = '廣州';

上面兩個SQL語句查詢執行計劃時發現,兩條語句的查詢計劃是一致的,都是直接走idx_name索引,不管where條件后面name和city的先后順序

image-20231124231026353

原因是,如上圖執行計劃中possiblie_keys = idx_name,idx_city。因為idx_name 先創建,所以優化器會先判斷是否走了idx_name索引,name=‘趙六’ 剛好檢索出一條記錄

實例4

explain select * from users where   city = '廣州' and name = '張三';

image-20231124232144601

這個時候走的是idx_city的索引,不管where條件后面name和city的順序。

案例5

explain select * from users where   city = '廣州' and name = '王五';
explain select * from users where   name = '王五' and city = '廣州' ;

image-20231124232553815

以上兩個SQL都走了idx_name的索引,和案例1有一些區別,案例1中,name = ‘張三’ 或者 city = '上海’都能查詢多多行數據,如果使用聯合索引的話效率更高。案例5中,由于根據idx_name就能把這一行的數據給定位到了,因此采用idx_name索引就能滿足。

以上都是MySQL優化器自動選擇索引,那如果我們想強制使用自己的索引可以使用 force index,具體如下

查詢name = ‘張三’ 、city = '廣州’的數據,我們通過查詢計劃得知走的是idx_city索引。

explain select * from users where name = '張三' and city = '廣州';

在這里插入圖片描述
如果我們強制使用idx_name索引,看看效果,發現已經強制使用idx_name索引
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端vue導出PPT,使用pptxgen.js

前言 公司新需求需要導出ppt給業務用,查閱資料后發現也挺簡單的,記錄一下。 如有不懂的可以留言!!! 1.安裝包 npm install pptxgenjs --save2.引入包 在需要使用的文件中引入 import Pptxgenfrom "pptxgenjs&…

Oracle研學-介紹及安裝

一 ORACLE數據庫特點: 支持多用戶,大事務量的事務處理數據安全性和完整性控制支持分布式數據處理可移植性(跨平臺,linux轉Windows) 二 ORACLE體系結構 數據庫:oracle是一個全局數據庫,一個數據庫可以有多個實例,每個…

nodejs+vue+python+PHP+微信小程序-留學信息查詢系統的設計與實現-安卓-計算機畢業設計

1、用戶模塊: 1)登錄:用戶注冊登錄賬號。 2)留學查詢模塊:查詢學校的入學申請條件、申請日期、政策變動等。 3)院校排名:查詢國外各院校的實力排名。 4)測試功能:通過入學…

Spring Boot WebSocket 客戶端

介紹 WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議,它可以提供實時的、雙向的數據傳輸。Spring Boot 提供了對 WebSocket 的支持,我們可以使用 Spring Boot WebSocket 客戶端來連接到 WebSocket 服務器,并進行實時通信。 本文將…

python-選擇排序

選擇排序是一種簡單直觀的排序算法,它的基本思想是每一輪選擇未排序部分的最小元素,然后將其放到已排序部分的末尾。這個過程持續進行,直到整個數組排序完成。(重點:通過位置找元素) 以下是選擇排序的詳細步驟和 Python 實現&…

HarmonyOS應用開發實戰—登錄頁面【ArkTS】

文章目錄 本頁面實戰效果預覽圖一.HarmonyOS應用開發1.1HarmonyOS 詳解1.2 ArkTS詳解二.HarmonyOS應用開發實戰—登錄頁面【ArkTS】2.1 ArkTS頁面源碼2.2 代碼解析2.3 心得本頁面實戰效果預覽圖 一.HarmonyOS應用開發 1.1HarmonyOS 詳解 HarmonyOS(鴻蒙操作系統)是華為公司…

小程序首頁白屏優化,并舉例說明

小程序首頁白屏優化 小程序首頁白屏優化是指在用戶進入小程序首頁時,能夠盡快展示內容,避免出現長時間的白屏加載狀態,提升用戶體驗。以下是一些常見的小程序首頁白屏優化方法: 減少首屏請求:盡量減少首頁需要請求的資…

js粒子效果(一)

效果: 代碼: <!doctype html> <html> <head><meta charset"utf-8"><title>HTML5鼠標經過粒子散開動畫特效</title><style>html, body {position: absolute;overflow: hidden;margin: 0;padding: 0;width: 100%;height: 1…

DELL MD3600F存儲重置管理軟件密碼

注意&#xff1a;密碼清除可能會導致業務秒斷&#xff0c;建議非業務時間操作 針對一臺控制器操作即可&#xff0c;另一控制器會同步操作 重置后密碼為空&#xff01; 需求&#xff1a;重置存儲管理軟件密碼 管理軟件中分配物理磁盤時提示輸入密碼(類似是否了解風險確認操作的提…

華為OD機試 - 二叉樹計算(Java JS Python C)

目錄 題目描述 輸入描述 輸出描述 用例 題目解析 JS算法源碼 Java算法源碼

io.lettuce.core.RedisCommandExecutionException

io.lettuce.core.RedisCommandExecutionException: ERR invalid password ERR invalid password-CSDN博客 io.lettuce.core.RedisCommandExecutionException /** Copyright 2011-2022 the original author or authors.** Licensed under the Apache License, Version 2.0 (the…

Rust UI開發(一):使用iced構建UI時,如何在界面顯示中文字符

注&#xff1a;此文適合于對rust有一些了解的朋友 iced是一個跨平臺的GUI庫&#xff0c;用于為rust語言程序構建UI界面。 iced的基本邏輯是&#xff1a; UI交互產生消息message&#xff0c;message傳遞給后臺的update&#xff0c;在這個函數中編寫邏輯&#xff0c;然后通過…

2023-11-24--oracle--實驗--[Merge 語句]

oracle--實驗---Merge語句 1.認知Merge 語句 ? merge 語句是 sql 語句的一種。在 SQL server 、 Oracle 數據庫中可用&#xff0c; MySQL 中不可用。 ? merge 用來合并 update 和 insert 語句。目的&#xff1a;通過 merge 語句&#xff0c;根據一張表&#xff08; 原數據表…

IOS免簽封裝打包蘋果APP的方法

IOS免簽app封裝打包蘋果APP的方法如下&#xff1a; 準備一個未簽名的IPA文件。獲取一個企業證書或個人證書&#xff0c;用于簽名IPA文件。將證書添加到Keychain Access中。安裝iOS App Signer&#xff08;可以在網上找到相關下載鏈接&#xff09;。打開iOS App Signer&#xf…

AT360-6T GNSS 單頻高精度授時模塊特性參數

AT360-6T 模塊具有高靈敏度、低功耗、低cost等優勢&#xff0c;可以滿足電力授時&#xff0c;通信授時等領域的應用。AT360-6T特點&#xff1a; 1.支持北斗二代/北斗三代信號 2.高精度授時 3.可靠性授時 實時高精度授時 AT360-6T 系列模塊的授時秒脈沖抖動可以達到 10ns&am…

Vue學習筆記-搭建Vuex

1.概念 在Vue實現集中式狀態&#xff08;數據&#xff09;管理的一個插件&#xff0c;對Vue中多個組件的共享狀態進行集中式的管理&#xff08;讀/寫&#xff09;&#xff0c;也是一種組件間的通信方式&#xff0c;適用于任意組件間的通信 2.使用場景 多個組件需要共享數據時…

Mysql存儲引擎分類

Mysql存儲引擎分類&#xff1a; 在選擇存儲引擎時&#xff0c;應該根據應用系統的特點選擇合適的存儲引擎。對于復雜的應用系統&#xff0c;還可以根據實際情況選擇多種存儲引擎進行組合。 InnoDB: 是Mysql的默認存儲引擎&#xff0c;支持事務、外鍵。如果應用對事務的完整性有…

杰發科技AC7801——ADC軟件觸發的簡單使用

前言 7801資料讀起來不是很好理解&#xff0c;大概率是之前MTK的大佬寫的。在此以簡單的方式進行描述。我們做一個簡單的規則組軟件觸發Demo。因為規則組通道只有一個數據寄存器&#xff0c;因此還需要用上DMA方式搬運數據到內存。 AC7801的ADC簡介 7801的ADC是一種 12 位 逐…

一文學會qml自定義組件

文章目錄 最簡單的自定義控件:自定義按鈕組件添加自定義信號在QML中,自定義組件通常是通過創建一個新的QML文件來實現的,這個文件定義了組件的屬性、信號、槽以及界面。你可以將這個組件看作是一個可重用的模塊,它可以在不同的QML場景中使用,而不需要重復編寫代碼。 以下…

洛谷P1157組合的輸出 遞歸:我他又來辣

沒沒沒沒沒沒沒錯&#xff0c;這是一道簡單的遞歸&#xff08;其實是深搜加回溯) 我不管&#xff0c;我說是遞歸就是遞歸。 上題干&#xff1a; 題目描述 排列與組合是常用的數學方法&#xff0c;其中組合就是從 n 個元素中抽出 r個元素&#xff08;不分順序且 r≤n&#x…