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

MySQL索引命中與失效代碼實(shí)現(xiàn)

 更新時(shí)間:2023年01月16日 11:05:22   作者:Blue?Protocol  
這篇文章主要介紹了MySQL索引命中與失效代碼實(shí)現(xiàn),文章內(nèi)容詳細(xì),簡(jiǎn)單易懂,需要的朋友可以參考下

創(chuàng)建表

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`)

這里有一個(gè)組合索引的最左匹配原則:MySQL最左匹配原則

查看MySQL中索引是否命中可以使用explainh執(zhí)行優(yōu)化器來(lái)查看

MySQL執(zhí)行優(yōu)化器

執(zhí)行優(yōu)化器,顧名思義,優(yōu)化語(yǔ)句的,準(zhǔn)確來(lái)說是優(yōu)化查詢語(yǔ)句。其實(shí)就是在我們寫的select語(yǔ)句前加一個(gè)Explain關(guān)鍵字。

索引的命中與失效情況

第一種情況:針對(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

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

第三種情況:在索引列上做了函數(shù)操作,會(huì)導(dǎo)致索引失效而導(dǎo)致全表掃描

我們先把那個(gè)聯(lián)合索引刪除掉,然后在username這一列上建立一個(gè)唯一索引:

刪除組合索引

drop index idx_username_password_user_rank on `user`

創(chuàng)建唯一索引

alter table `user` ADD UNIQUE key (`username`)

查看索引

explain SELECT * from `user` where username= 'user110819'

explain SELECT * from `user` where concat(username,'')= 'user110819'

第四種情況:模糊查詢前綴是以%開頭的,索引失效

explain SELECT * from `user` where username like '%user11081'

第五種情況:模糊查詢中后綴是以%,可以命中索引

explain SELECT * from `user` where username like 'user11081%'

第六種情況:使用is not null 會(huì)導(dǎo)致索引失效

explain SELECT * from `user` where username is not null

第六種情況:使用and時(shí),其中有一個(gè)條件查詢帶有索引而另一個(gè)不帶索引,不會(huì)導(dǎo)致索引失效。而使用or時(shí),如果條件查詢中其中一個(gè)不帶索引,導(dǎo)致索引失效,必須全部帶有索引。

and情況:

explain SELECT * from `user` where username = "liuxiangcheng" and password = "515239"

or情況:

explain SELECT * from `user` where username = "liuxiangcheng" or user_rank = 1

我們給user_rank加上索引

alter table `user` ADD index (`user_rank`)

再次查詢:

explain SELECT * from `user` where username = "liuxiangcheng" or user_rank = 1

第七種情況:使用不等于(!= 或者<>)的時(shí)候,會(huì)導(dǎo)致索引失效

explain SELECT * from `user` where   user_rank != 1

or 

explain SELECT * from `user` where   user_rank <> 1

 第八種情況:使用范圍查詢之后索引失效

explain SELECT * from `user` where user_rank >(<,>=,<=) 1

 第九種情況:隱式轉(zhuǎn)換可能會(huì)導(dǎo)致我們的索引失效

varchar類型,如果用int類型來(lái)查詢,索引失效

數(shù)據(jù)庫(kù)user表中我們的password是varchar類型

如果我們?cè)跅l件查詢中使用整形來(lái)替代,那么這個(gè)時(shí)候索引就會(huì)失效,where varchar = int 索引失效

// password is varchar type

explain SELECT * from `user` where password = 515239

explain SELECT * from `user` where password = '515239'

explain SELECT * from `user` where password = "515239"

如果是int類型,我們使用varchar來(lái)替代,索引命中

// user_rank is int type

explain SELECT * from `user` where user_rank = "1"

explain SELECT * from `user` where user_rank = '1'

explain SELECT * from `user` where user_rank = 1

總結(jié)隱式轉(zhuǎn)換

  1. 當(dāng)操作符左右兩邊的數(shù)據(jù)類型不一致時(shí),會(huì)發(fā)生隱式轉(zhuǎn)換。
  2. 當(dāng) where 查詢操作符左邊為數(shù)值類型時(shí)發(fā)生了隱式轉(zhuǎn)換,但是索引會(huì)命中,對(duì)查詢效率影響不大,但還是不推薦這么做
  3. 當(dāng) where 查詢操作符左邊為字符類型時(shí)發(fā)生了隱式轉(zhuǎn)換,這樣會(huì)導(dǎo)致索引失效,造成全表掃描。
  4. 字符串轉(zhuǎn)換為數(shù)值類型時(shí),非數(shù)字開頭的字符串會(huì)轉(zhuǎn)化為0,以數(shù)字開頭的字符串會(huì)截取從第一個(gè)字符到第一個(gè)非數(shù)字內(nèi)容為止的值為轉(zhuǎn)化結(jié)果。

總結(jié)

MySQL中索引失效的情況

1、組合索引中不遵循最左匹配原則,帶頭大哥不在,導(dǎo)致索引失效,全表掃描。
2、在索引列上做了函數(shù)操作,導(dǎo)致索引失效,全表掃描。
3、模糊查詢前綴是以%開頭的,導(dǎo)致索引失效,全表掃描。
4、使用is not null 會(huì)導(dǎo)致索引失效。
5、使用or時(shí),如果條件查詢中其中一個(gè)不帶索引,導(dǎo)致索引失效,全表掃描。
6、使用不等于(!= 或者<>)的時(shí)候,會(huì)導(dǎo)致索引失效。
7、使用范圍查詢(>、<、>=、<=)之后索引失效。
8、隱式轉(zhuǎn)換可能會(huì)導(dǎo)致我們的索引失效。

 查看MySQL中索引是否命中可以使用explainh執(zhí)行優(yōu)化器來(lái)查看。

到此這篇關(guān)于MySQL索引命中與失效代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL索引命中與失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL非常重要的日志bin log詳解

    MySQL非常重要的日志bin log詳解

    bin log想必大家多多少少都有聽過,它是MySQL中一個(gè)非常重要的日志,因?yàn)樗婕暗綌?shù)據(jù)庫(kù)層面的主從復(fù)制、高可用等設(shè)計(jì),所以本文就給大家詳細(xì)的講解MySQL非常重要的日志—bin log,需要的朋友可以參考下
    2023-07-07
  • Starting MySQL.Manager of pid-file quit without updating file.[FAILED]的解決方法

    Starting MySQL.Manager of pid-file quit without updating fil

    因?yàn)橛脖P滿了,Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
    2010-02-02
  • mysql執(zhí)行語(yǔ)句后只有錯(cuò)誤代碼,沒有錯(cuò)誤信息的問題

    mysql執(zhí)行語(yǔ)句后只有錯(cuò)誤代碼,沒有錯(cuò)誤信息的問題

    這篇文章主要介紹了mysql執(zhí)行語(yǔ)句后只有錯(cuò)誤代碼,沒有錯(cuò)誤信息的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • MySQL?Test?Run?測(cè)試框架詳細(xì)介紹?

    MySQL?Test?Run?測(cè)試框架詳細(xì)介紹?

    這篇文章主要介紹了MySQL?Test?Run?測(cè)試框架,主要通過include、suite展開MySQL?Test?Run?測(cè)試框架相關(guān)內(nèi)容,文章介紹詳細(xì),需要的小伙伴可以參考一下
    2022-02-02
  • mysql中rpm方式安裝的詳解

    mysql中rpm方式安裝的詳解

    在本文中小編給大家整理了關(guān)于mysql安裝之rpm方式安裝的詳細(xì)步驟以及注意點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • 最新評(píng)論