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

MySQL中的最左匹配原則

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

說(shuō)明

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

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 '用戶(hù)id',
  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶(hù)名',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶(hù)密碼',
  `create_essay` int(5) NOT NULL COMMENT '原創(chuàng)文章',
  `user_visited` int(10) NOT NULL COMMENT '被訪問(wèn)量',
  `user_rank` int(5) NOT NULL COMMENT '用戶(hù)排名',
  `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 '用戶(hù)昵稱(chēng)',
  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`)

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

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

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

比如我們建立了(x,y,z)索引,我們就不需要建立(x)索引,(x,y)索引,因?yàn)槲覀兘ⅲ▁,y,z)索引就相當(dāng)于建立了(x)索引,(x,y)組合索引,(x,y,z)組合索引。  

最左匹配原則

什么是最左匹配原則?

然后我們?cè)诮⑺饕臅r(shí)候,還需要遵循一個(gè)規(guī)范,就是最左匹配原則,也就是帶頭大哥在不在的問(wèn)題。

在寫(xiě)查詢(xún)條件的時(shí)候,我們一定要遵循最左匹配原則,只要大哥不在,索引就會(huì)失效了。

比如:

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

如果我們?cè)诓樵?xún)過(guò)程中,我們這樣寫(xiě)

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

我們這個(gè)查詢(xún)語(yǔ)句是不會(huì)命中索引的,因?yàn)閹ь^大哥不在,所以索引失效。

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

為什么會(huì)有最左匹配原則?

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

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

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

我們來(lái)舉一個(gè)例子。我們創(chuàng)建一個(gè)(a,b)的組合索引,這個(gè)組合索引會(huì)創(chuàng)建兩顆索引樹(shù)(a),(a,b),而(a,b)的索引樹(shù)就是下面這個(gè)樣子的。

在這里插入圖片描述

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

但是我們?cè)赼值一定的情況下,b的值又是順序排列的,但是這種順序排列是相對(duì)于a來(lái)說(shuō)的。

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

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

實(shí)例說(shuō)明

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

建立一個(gè)組合索引

idx_username_password_user_rank(`username`,`password`,`user_rank`)
// 命中索引跟順序無(wú)關(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索引命中與失效具體見(jiàn)我另一篇博客:MySQL索引命中與失效

總結(jié)

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

相關(guān)文章

  • MySQL主鍵與外鍵的基本概念與作用詳解

    MySQL主鍵與外鍵的基本概念與作用詳解

    在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),合理的添加主鍵和外鍵能有效保障數(shù)據(jù)的完整性和一致性,使得數(shù)據(jù)管理更加科學(xué)高效,本文將詳細(xì)介紹MySQL中主鍵和外鍵的基本概念、它們之間的關(guān)系、作用及一些高級(jí)知識(shí)點(diǎn),感興趣的朋友一起看看吧
    2025-10-10
  • mysql遷移指定表歷史數(shù)據(jù)的多種方案

    mysql遷移指定表歷史數(shù)據(jù)的多種方案

    本文介紹了五種MySQL歷史數(shù)據(jù)遷移方案,包括使用mysqldump、ETL工具、分批遷移、主從復(fù)制和表空間傳輸,每種方案都有其適用場(chǎng)景和注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧

    MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧

    這篇文章主要介紹了Windows 10,MySQL版本是5.7.12-log環(huán)境下mysql中聚合函數(shù)count的使用和性能優(yōu)化,需要的朋友可以參考下
    2018-06-06
  • MySQL中select...for update鎖表

    MySQL中select...for update鎖表

    select…for update在MySQL中,是一種悲觀鎖的用法,一般情況下,會(huì)鎖住一行數(shù)據(jù),但如果沒(méi)有使用正確的話,也會(huì)把整張表鎖住,本文就來(lái)介紹一下,感興趣的可以了解一下
    2023-10-10
  • 利用Mysql定時(shí)+存儲(chǔ)過(guò)程創(chuàng)建臨時(shí)表統(tǒng)計(jì)數(shù)據(jù)的過(guò)程

    利用Mysql定時(shí)+存儲(chǔ)過(guò)程創(chuàng)建臨時(shí)表統(tǒng)計(jì)數(shù)據(jù)的過(guò)程

    這篇文章主要介紹了利用Mysql定時(shí)+存儲(chǔ)過(guò)程創(chuàng)建臨時(shí)表統(tǒng)計(jì)數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 往MySQL中存儲(chǔ)圖片的方法

    往MySQL中存儲(chǔ)圖片的方法

    這篇文章主要介紹了往MySQL中存儲(chǔ)圖片的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • mysql 5.7.11 安裝配置教程

    mysql 5.7.11 安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.11 安裝配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢(xún)

    簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢(xún)

    分析MySQL語(yǔ)句查詢(xún)性能的方法除了使用 EXPLAIN 輸出執(zhí)行計(jì)劃,還可以讓MySQL記錄下查詢(xún)超過(guò)指定時(shí)間的語(yǔ)句,我們將超過(guò)指定時(shí)間的SQL語(yǔ)句查詢(xún)稱(chēng)為“慢查詢(xún)”
    2017-01-01
  • mysql ERROR 1044 (42000): Access denied for user ''''@''localhost'' to database

    mysql ERROR 1044 (42000): Access denied for user ''''@''loca

    這篇文章主要介紹了mysql下提示ERROR 1044 (42000): Access denied for user ''@'localhost' to database,需要的朋友可以參考下
    2015-09-09
  • Mysql到Elasticsearch高效實(shí)時(shí)同步Debezium實(shí)現(xiàn)

    Mysql到Elasticsearch高效實(shí)時(shí)同步Debezium實(shí)現(xiàn)

    這篇文章主要為大家介紹了Mysql到Elasticsearch高效實(shí)時(shí)同步Debezium的實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02

最新評(píng)論

互助| 邳州市| 安西县| 静乐县| 五大连池市| 洛宁县| 永寿县| 周至县| 宁河县| 宣威市| 喜德县| 达日县| 合阳县| 乐业县| 福建省| 钦州市| 镇赉县| 津南区| 从江县| 同心县| 始兴县| 济南市| 吴桥县| 南投县| 景泰县| 桂阳县| 麻城市| 尚义县| 清镇市| 红桥区| 漯河市| 玛多县| 嵊泗县| 临漳县| 桂平市| 佛坪县| 马鞍山市| 革吉县| 沁水县| 北海市| 天津市|