1. 選擇性較低的列是否適合加索引? 索引選擇性等於列中不重覆(distinct)的行數量(也叫基數),與記錄總數的比值。範圍在0 1之間。數值越大,索引越快。 例如主鍵是唯一的,不重覆的,所以選擇性=1。 常見的選擇性較低的列,例如是否熱門,要不1,要不0。選擇性等於2/記錄總數,所以是非常低的。 ...
1. 選擇性較低的列是否適合加索引?
索引選擇性等於列中不重覆(distinct)的行數量(也叫基數),與記錄總數的比值。範圍在0-1之間。數值越大,索引越快。
例如主鍵是唯一的,不重覆的,所以選擇性=1。
常見的選擇性較低的列,例如是否熱門,要不1,要不0。選擇性等於2/記錄總數,所以是非常低的。
而這種列適合加索引嗎?
答案是要區分看待:
假如表中是否熱門is_hot=1的行有100行,is_hot=0的行有100w行。
那麼
如果需求是查詢is_hot=1的行,我們設置索引idx(is_hot)是有用的
如果需求是查詢is_hot=0的行,我們設置索引就沒什麼用了。
測試:
100w的表,type=1的有11行,其他都是type=2
沒有設置type索引,搜索type=1,要檢索100w行,也就是全表掃描,用時0.7s
加了type索引,搜索type=1,只要檢索11行,用時0.04。搜索type=2,也是要檢索100w行,用時0.7s,也是差不多全部掃描
2.Mysql的索引是否會自動加上主鍵
假如ID是主鍵,索引a(SongType)
和索引b(SongType,ID)
是否等價,也就是Mysql是否會為索引加上主鍵ID?
答案是不會的
測試:
有100w數據,前50w SongType=1,後49w SongType是2,最後1w SongTYpe=1,ID是主鍵
有索引a(SongType) 。
sql :select * from table where id>500000 and SongType=1
。
會使用主鍵索引,需要檢索行50w行。用時0.5s
加索引b(SongType,ID)後,會使用索引b,只需要掃描1w行數據。用時0.02s
所以索引a,並不會包含主鍵
3. 多列排序時使用索引的坑
A key_part specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.
根據Mysql文檔的說明,創建索引的時候,可以加上asc或者desc,例如:add index idx(a asc,b desc)
.但是實際Mysql是會忽略的(好坑。。。)好像8.0版本之後支持desc了。
這會有什麼影響呢?
假如有列test1和test2,都是int類型。
我們創建索引`idx1
(test1
,test2
)`,
假如我們要按test1和test2排序,例如SQL
explain select * from table order by test1 ,test2 limit 1;
可以使用索引的排序:
- order by test1
- order by test1 desc
- order by test1,test2
- order by test1 desc,test2 desc
不可以使用索引的排序:
- order by test1,test2,desc
- order by test1 desc,test2
因為索引不支持desc,所以多列的索引是按全部列的升序存儲的。所以只排序一列,全部列升序,全部列降序,都能用索引。但是第一列用升序,第二列用降序,或者第一列降序,第二列用升級,都不能使用索引。
未經同意,請不要轉發