本著「先問是不是,再問為什麼」的原則,我們搞個試驗。
首先準備乙個表「goods_detail」,主要字段:
tenant_id、buss_day、goods_id
我們建立乙個組合索引:
key `idx_tbg` (`tenant_id`,`buss_day`,`goods_id`)
查詢語句sql1:
select
* from
goods_detail
where
tenant_id = '996'
and buss_day between "2020/1/1" and "2020/1/6"
and goods_id = '985';
查詢語句sql2:
select
* from
goods_detail
where
tenant_id = '996'
and buss_day in ( "2020/1/1", "2020/1/2", "2020/1/3", "2020/1/4", "2020/1/5", "2020/1/6" )
and goods_id = '985';
執行計畫如下:
從以上兩個執行計畫可以看出:buss_day使用in匹配比between匹配掃瞄的行數要低得多
原因就在於:sql2的組合索引中goods_id列條件使用上了索引
為何between不走索引,採用in後可以走索引
在探尋原因之前,需要先看下索引是如何在mysql中儲存的。
我們通常使用的innodb中,索引的資料結構是b+樹(樹高度低、效率高),有兩種索引:聚簇索引、二級索引
聚簇索引:所有完整的使用者記錄都存放在這個聚簇索引的葉子節點處,在innodb儲存引擎中,聚簇索引就是資料的儲存方式
二級索引:除聚簇索引之外的索引,由使用者自主建立,不包含完整的使用者記錄,只包含使用者設定的部分字段
聯合索引
使用者在建立二級索引時,可以選擇單個字段作為索引,也可以選擇多個字段作為索引。我們稱多個字段組成的索引為組合索引(或聯合索引)
mysql在儲存聯合索引時:
先把各個記錄和頁按照從左往右第一列進行排序。
在記錄的前一列相同的情況下,採用下一列進行排序
依此類推
通過以上操作,保證了所有索引資料是按照索引列的值從小到大的順序排好序的。
當我們要查詢匹配索引條件時,只需從左往右依次匹配。
分析下sql1:
第一列:tenant_id 等值匹配,可以匹配到精確地索引
第二列:buss_day範圍匹配,匹配出來的buss_day具體有哪些,是不可以知的
第三列:由於匹配出來的buss_day不可知,goods_id無法走索引匹配
分析下sql2:
第一列:tenant_id 等值匹配,可以匹配到精確地索引
第二列:buss_day等值匹配,匹配出來的buss_day是可知的
第三列:由於匹配出來的buss_day可知,goods_id走索引匹配
在組合索引中,除了使用了between匹配外,採用》、
歡迎拍磚。。。
mysql 查詢結構組合 MySQL的查詢和結構
多表關聯查詢 交叉連線 交叉連線的表現 行數相乘 列數相加 內連線 內連線也叫等值連線,內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行 隱式內連線 select from a,b where a.id b.id 顯示內連線 seect from a inner join b on a.i...
mysql的索引怎麼儲存 Mysql中的索引 儲存
索引的使用與資料庫中表的引擎有一定的關聯 索引的儲存的資料型別分為兩種 btree hash myisam innodb 儲存型別只支援btree memory heap支援兩種 一般情況下,有以下幾種常用的索引 普通索引 index create table t1 index 索引名 列名 沒有唯...
索引在mysql中叫什麼 MySQL中的索引簡介
一 索引的優點 為什麼要建立索引?這是因為,建立索引可以大大提高系統的查詢效能。第一 通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二 可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。第三 可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四 在使用分...