MySql中的範圍查詢對組合索引使用的影響

2021-10-04 11:57:23 字數 1700 閱讀 1823

本著「先問是不是,再問為什麼」的原則,我們搞個試驗。

首先準備乙個表「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中的索引簡介

一 索引的優點 為什麼要建立索引?這是因為,建立索引可以大大提高系統的查詢效能。第一 通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二 可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。第三 可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四 在使用分...