MySQL中between...and的使用對索引的影響說明
1. 問題場景
一開始在某個字段加了普通索引,SQL語句查找該字段范圍內(nèi)的數(shù)據(jù)。
開始加索引的時候是能使用上索引的,但是過了幾天,數(shù)據(jù)量增大,發(fā)現(xiàn)檢索語句沒有走索引了。
2. 準備測試
2.1 創(chuàng)建測試表
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條測試數(shù)據(jù)
insert into test_index(name,age,create_time) values('Tom',12,time()),('Tobie',20,time()),('Jack',15,time())
3. 測試是否走索引(總記錄數(shù)total-t,結(jié)果數(shù)result-r)
3.1 total = 3
測試一(t=3,r=0,走索引):
測試二(t=3,r=1,走索引):
測試三(t=3,r=2,走索引):
測試四(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é)論
不嚴謹總結(jié)
自己還測了更大的數(shù)據(jù),發(fā)現(xiàn)betweet…and的使用與單純的數(shù)據(jù)量無關(guān),而與查找到的數(shù)據(jù)與總數(shù)據(jù)的比有關(guān)。
當總數(shù)據(jù)量較小時,有很大概率會走索引,此時查到的結(jié)果數(shù)可以允許比較大
但總數(shù)據(jù)量比較大之后,查找到的結(jié)果數(shù)據(jù)越小時,越大概率使用上索引
也就是說,如果有10w的數(shù)據(jù),而你需要查的數(shù)據(jù)為200條,此時是走索引的。但是,如果你查到的結(jié)果有5000條,那么,極大可能是不走索引的
稍嚴謹一些的總結(jié)
查詢數(shù)據(jù)時,如果走普通索引,那么會產(chǎn)生回表操作,因為普通索引屬于非聚集索引,葉子節(jié)點存放的是主鍵字段的值,拿到主鍵字段后再去表中根據(jù)主鍵值找到對應的記錄。
因此,當數(shù)據(jù)量很大,而查詢數(shù)據(jù)也很大時,考慮到回表的消耗,就不走索引;
當數(shù)據(jù)量很大,而查詢數(shù)據(jù)很小,這個時候比起全表掃描,回表的消耗相對少,所以走索引
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL如何運行sql文件圖文詳解(以Navicat做演示)
Navicat是MySQL非常好用的可視化管理工具,功能非常強大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,這篇文章主要給大家介紹了關(guān)于MySQL如何運行sql文件(以Navicat做演示)的相關(guān)資料,需要的朋友可以參考下2024-08-08超詳細mysql left join,right join,inner join用法分析
比較詳細的mysql的幾種連接功能分析,只要你看完就能學會的好東西2008-08-08MySQL不使用order by實現(xiàn)排名的三種思路總結(jié)
ORDER BY語句用于根據(jù)指定的列對結(jié)果集進行排序,在日常開發(fā)中也經(jīng)常會用到,但下面這篇文章主要給大家介紹了關(guān)于MySQL不使用order by實現(xiàn)排名的三種思路,需要的朋友可以參考下2021-06-06MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復數(shù)據(jù)
這篇文章主要介紹了MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Ubuntu 18.04配置mysql以及配置遠程連接的步驟
這篇文章主要給大家介紹了關(guān)于Ubuntu 18.04配置mysql以及配置遠程連接的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-07-07clickhouse中Nullable與非空字段的建表與類型互轉(zhuǎn)方式
這篇文章主要介紹了clickhouse中Nullable與非空字段的建表與類型互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12