亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中的最左匹配原則

 更新時間:2023年09月05日 14:28:22   作者:Blue?Protocol  
這篇文章主要介紹了MySQL中的最左匹配原則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

說明

說到最左匹配原則,我們還得先從組合索引說起。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶名',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶密碼',
  `create_essay` int(5) NOT NULL COMMENT '原創(chuàng)文章',
  `user_visited` int(10) NOT NULL COMMENT '被訪問量',
  `user_rank` int(5) NOT NULL COMMENT '用戶排名',
  `perms` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `nickname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用戶昵稱',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 116856 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
// 創(chuàng)建組合索引
ALTER TABLE `user` ADD INDEX idx_username_password_user_rank (`username`,`password`,`user_rank`)

我們在創(chuàng)建索引的時候,如果我們只選一列,那就叫單列索引,而如果我們選擇多列,那么就是組合索引。

在上表中我們創(chuàng)建了一個組合索引:idx_username_password_user_rank( username , password , user_rank )

一般我們組合索引字段數(shù)量不建議超過5個,而我們需要理解組合索引的最左匹配原則,我們就可以避免重復(fù)創(chuàng)建索引。

比如我們建立了(x,y,z)索引,我們就不需要建立(x)索引,(x,y)索引,因為我們建立(x,y,z)索引就相當(dāng)于建立了(x)索引,(x,y)組合索引,(x,y,z)組合索引。  

最左匹配原則

什么是最左匹配原則?

然后我們在建立索引的時候,還需要遵循一個規(guī)范,就是最左匹配原則,也就是帶頭大哥在不在的問題。

在寫查詢條件的時候,我們一定要遵循最左匹配原則,只要大哥不在,索引就會失效了。

比如:

我們創(chuàng)建了一個組合索引叫 idx_username_password_user_rank ( username , password , user_rank )

如果我們在查詢過程中,我們這樣寫

select * from table where password= “xxx” and user_rank = 1

我們這個查詢語句是不會命中索引的,因為帶頭大哥不在,所以索引失效。

也就是我們不能使用空中樓閣,我們把我們的 username當(dāng)成1樓,password當(dāng)成2樓,user_rank當(dāng)成3樓,1樓都不在,我們怎么上2、3樓,這就是最左匹配原則,第一個根本就沒有匹配到,后面的就根本不用看了。  

為什么會有最左匹配原則?

要想知道為什么會在組合索引中有最左匹配原則,我們得先理解索引的本質(zhì)。

我們知道索引的本質(zhì)是一顆B+Tree,所以組合索引的本質(zhì)也是一顆B+Tree,不同的是組合索引的鍵值的數(shù)量不是1,而是>=2。

又因為構(gòu)建一顆B+Tree只能根據(jù)一個值來確定索引關(guān)系,所以MySQL根據(jù)組合索引的最左字段來構(gòu)建B+Tree。

我們來舉一個例子。我們創(chuàng)建一個(a,b)的組合索引,這個組合索引會創(chuàng)建兩顆索引樹(a),(a,b),而(a,b)的索引樹就是下面這個樣子的。

在這里插入圖片描述

我們可以看到a的值是天然有序的1、 1、 2、 2、 3、 3,而b的值是沒有順序的1、 2、 1、 4、 1、 2。

但是我們在a值一定的情況下,b的值又是順序排列的,但是這種順序排列是相對于a來說的。

所以最左匹配原則是因為 MySQL創(chuàng)建組合索引樹的規(guī)則是首先對組合索引最左邊第一個字段進(jìn)行排序,然后在第一個字段排序的基礎(chǔ)上,再對第二個字段進(jìn)行排序。

所以b=2這種查詢條件用不到這兩顆聯(lián)合索引樹。

實例說明

針對聯(lián)合索引,是否遵循最左匹配原則;

建立一個組合索引

idx_username_password_user_rank(`username`,`password`,`user_rank`)
// 命中索引跟順序無關(guān)
explain SELECT * from `user` where username =  "liuxiangcheng" and password = "515239" and user_rank = 1
explain SELECT * from `user` where user_rank = 1 and username =  "liuxiangcheng" and password = "515239"  
explain SELECT * from `user` where user_rank = 1 and password = "515239" and username =  "liuxiangcheng"

結(jié)果:

在這里插入圖片描述

去掉大哥,看看索引是否命中;

// 去掉大哥
explain SELECT * from `user` where   password = "515239" and user_rank = 1

去掉大哥之后,索引失效,全表掃描。

在這里插入圖片描述

MySQL索引命中與失效

查看MySQL索引命中與失效具體見我另一篇博客:MySQL索引命中與失效

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql實戰(zhàn)練習(xí)之簡單圖書管理系統(tǒng)

    Mysql實戰(zhàn)練習(xí)之簡單圖書管理系統(tǒng)

    由于課設(shè)需要做這個,于是就抽了點閑余時間,寫了下,用Mysql與Java,基本全部都涉及到,包括借書/還書,以及書籍信息的更新,查看所有的書籍。需要的朋友可以參考下
    2021-09-09
  • MySql之視圖索引的具體使用

    MySql之視圖索引的具體使用

    MySql 視圖索引是一種基于視圖的索引,它允許在視圖上創(chuàng)建索引以提高查詢性能,本文主要介紹了MySql之視圖索引的具體使用,感興趣的可以了解一下
    2023-08-08
  • MySQL實現(xiàn)樹狀所有子節(jié)點查詢的方法

    MySQL實現(xiàn)樹狀所有子節(jié)點查詢的方法

    這篇文章主要介紹了MySQL實現(xiàn)樹狀所有子節(jié)點查詢的方法,涉及mysql節(jié)點查詢、存儲過程調(diào)用等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Mysql行鎖和表鎖的實現(xiàn)示例

    Mysql行鎖和表鎖的實現(xiàn)示例

    行鎖和表鎖是兩種常見的鎖定機(jī)制,本文主要介紹了Mysql行鎖和表鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • mysql8.0.21安裝教程圖文詳解

    mysql8.0.21安裝教程圖文詳解

    這篇文章主要介紹了mysql8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Mysql?InnoDB?B+樹索引目錄項記錄頁管理

    Mysql?InnoDB?B+樹索引目錄項記錄頁管理

    這篇文章主要為大家介紹了Mysql?InnoDB?B+樹索引目錄項記錄頁管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Mysql及Navicat中設(shè)置字段自動填充當(dāng)前時間及修改時間實現(xiàn)

    Mysql及Navicat中設(shè)置字段自動填充當(dāng)前時間及修改時間實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Mysql及Navicat中設(shè)置字段自動填充當(dāng)前時間及修改時間實現(xiàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-07-07
  • Mysql在線回收undo表空間實戰(zhàn)記錄

    Mysql在線回收undo表空間實戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于Mysql在線回收undo表空間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • MySql日期查詢語句詳解

    MySql日期查詢語句詳解

    在mysql中對時間日期操作的函數(shù)有很多,有時我們就希望直接通過sql查詢出指定日期的數(shù)據(jù)
    2013-11-11
  • Linux7.6二進(jìn)制安裝Mysql8.0.27詳細(xì)操作步驟

    Linux7.6二進(jìn)制安裝Mysql8.0.27詳細(xì)操作步驟

    大家好,本篇文章主要講的是Linux7.6二進(jìn)制安裝Mysql8.0.27詳細(xì)操作步驟,感興趣的同學(xué)快來看一看吧,希望對你起到幫助
    2021-11-11

最新評論