MySQL中between...and的使用對(duì)索引的影響說(shuō)明
1. 問(wèn)題場(chǎng)景
一開(kāi)始在某個(gè)字段加了普通索引,SQL語(yǔ)句查找該字段范圍內(nèi)的數(shù)據(jù)。
開(kāi)始加索引的時(shí)候是能使用上索引的,但是過(guò)了幾天,數(shù)據(jù)量增大,發(fā)現(xiàn)檢索語(yǔ)句沒(méi)有走索引了。
2. 準(zhǔn)備測(cè)試
2.1 創(chuàng)建測(cè)試表
CREATE TABLE `test_index` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' , `age` tinyint(5) UNSIGNED NOT NULL DEFAULT 0 , `status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 , `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) )
2.2 在age字段上加普通索引
ALTER TABLE `test_index` ADD INDEX `age` (`age`) USING BTREE
2.3 插入3條測(cè)試數(shù)據(jù)
insert into test_index(name,age,create_time) values('Tom',12,time()),('Tobie',20,time()),('Jack',15,time())
3. 測(cè)試是否走索引(總記錄數(shù)total-t,結(jié)果數(shù)result-r)
3.1 total = 3
測(cè)試一(t=3,r=0,走索引):
測(cè)試二(t=3,r=1,走索引):
測(cè)試三(t=3,r=2,走索引):
測(cè)試四(t=3,r=3,不走索引):
3.2 total = 10
- t=10,r=0,走索引
- t=10,r=4,走索引
- t=10,r=5,不走索引
3.3 total=100
- t=100,r=15,走索引
- t=100,r=18,走索引
- t=100,r=19,不走索引
3.4 total = 1000
- t=1000,r=100,走索引
- t=1000,r=150,走索引
- t=1000,r=170,走索引
- t=1000,r=171,不走索引
3.5 total = 10000
- t=10000,r=900,走索引
- t=10000,r=940,走索引
- t=10000,r=941,不走索引
- t=10000,r=1000,不走索引
3.6 total = 100000
- t=100000,r=3948,走索引
- t=10000,r=3949,不走索引
4. 結(jié)論
不嚴(yán)謹(jǐn)總結(jié)
自己還測(cè)了更大的數(shù)據(jù),發(fā)現(xiàn)betweet…and的使用與單純的數(shù)據(jù)量無(wú)關(guān),而與查找到的數(shù)據(jù)與總數(shù)據(jù)的比有關(guān)。
當(dāng)總數(shù)據(jù)量較小時(shí),有很大概率會(huì)走索引,此時(shí)查到的結(jié)果數(shù)可以允許比較大
但總數(shù)據(jù)量比較大之后,查找到的結(jié)果數(shù)據(jù)越小時(shí),越大概率使用上索引
也就是說(shuō),如果有10w的數(shù)據(jù),而你需要查的數(shù)據(jù)為200條,此時(shí)是走索引的。但是,如果你查到的結(jié)果有5000條,那么,極大可能是不走索引的
稍嚴(yán)謹(jǐn)一些的總結(jié)
查詢(xún)數(shù)據(jù)時(shí),如果走普通索引,那么會(huì)產(chǎn)生回表操作,因?yàn)槠胀ㄋ饕龑儆诜蔷奂饕?,葉子節(jié)點(diǎn)存放的是主鍵字段的值,拿到主鍵字段后再去表中根據(jù)主鍵值找到對(duì)應(yīng)的記錄。
因此,當(dāng)數(shù)據(jù)量很大,而查詢(xún)數(shù)據(jù)也很大時(shí),考慮到回表的消耗,就不走索引;
當(dāng)數(shù)據(jù)量很大,而查詢(xún)數(shù)據(jù)很小,這個(gè)時(shí)候比起全表掃描,回表的消耗相對(duì)少,所以走索引
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL如何運(yùn)行sql文件圖文詳解(以Navicat做演示)
Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿足我們?nèi)粘?shù)據(jù)庫(kù)開(kāi)發(fā)的所有需求,這篇文章主要給大家介紹了關(guān)于MySQL如何運(yùn)行sql文件(以Navicat做演示)的相關(guān)資料,需要的朋友可以參考下2024-08-08超詳細(xì)mysql left join,right join,inner join用法分析
比較詳細(xì)的mysql的幾種連接功能分析,只要你看完就能學(xué)會(huì)的好東西2008-08-08mysql對(duì)于模糊查詢(xún)like的一些匯總
這篇文章主要給大家介紹了關(guān)于mysql對(duì)于模糊查詢(xún)like的一些匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10MySQL不使用order by實(shí)現(xiàn)排名的三種思路總結(jié)
ORDER BY語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序,在日常開(kāi)發(fā)中也經(jīng)常會(huì)用到,但下面這篇文章主要給大家介紹了關(guān)于MySQL不使用order by實(shí)現(xiàn)排名的三種思路,需要的朋友可以參考下2021-06-06Mysql如何查詢(xún)字符串開(kāi)頭的數(shù)據(jù)
這篇文章主要介紹了Mysql如何查詢(xún)字符串開(kāi)頭的數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)
這篇文章主要介紹了MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟
這篇文章主要給大家介紹了關(guān)于Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07clickhouse中Nullable與非空字段的建表與類(lèi)型互轉(zhuǎn)方式
這篇文章主要介紹了clickhouse中Nullable與非空字段的建表與類(lèi)型互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Mysql分組查詢(xún)?nèi)ax那條記錄其它字段方式
這篇文章主要介紹了Mysql分組查詢(xún)?nèi)ax那條記錄其它字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08mysql字符集和數(shù)據(jù)庫(kù)引擎修改方法分享
使用虛擬主機(jī)空間上的phpmyadmin操作數(shù)據(jù)庫(kù)的時(shí)候,如果看到phpmyadmin首頁(yè)上顯示的MySQL 字符集為cp1252 West European (latin1),當(dāng)我們導(dǎo)入數(shù)據(jù)時(shí)就會(huì)出現(xiàn)亂碼2012-02-02