给bool型加索引的目的是什么?区分度是2,就算加了,估计也是要走全表扫描的。也就是说加了索引带来写性能的下降和存储空间的增大,但对读性能提升没什么帮助。还不如不加。


可以加,但针对只有两种(true / false)或寥寥几种取值的栏位加索引意义不大,反而还会增加 DBMS 的负担。除非其中个别值非常罕见,同时你需要主要访问这些非常罕见的值。

比如要对一个 bool 栏位索引,首先你要保证其中 99.9% 的值都是 false,而你恰恰仅需要依靠索引找到其中值为 true 的那些行。


不可以。

索引的目的:空间换时间,加快查询效率。需要用索引的存储空间来换取查询效率的极大提升。

什么情况下加索引可以提高查询效率?答案是:具有区分度的栏位,也即索引选择性高

[公式]

学生表(student)的table 如下:

Name sex
小明 男
小红 女
....

sex上的索引选择性为:

select count(distinct sex)/count(*) from student;

name的索引选择性为:

select count(distinct name)/count(*) from student;

很显然,name 的索引选择性比sex的索引选择性高很多。mysql查询的时候再索引树上可以通过name快速找到一条数据,反之,在sex的索引树上则不能,因为男生和女生很多,需要一个一个check。

故:在sex上加索引并不能提高查询效率,反而会增加空间开销。


如果是单列的没有必要,典型的反例

如果是联合索引的话可以测试一下效果,如果提升不错的话可以加


mysql没有布尔,如果这列的值只有几种可能,也不介意加索引

可以加,但是没有意义。区分度太小,加了索引,优化器可能都不会使用索引,而是改用range scan。


首先,没有必要在这种选择性不高的列加索引,其次,即使你加上,现有版本的mysql优化器也可能因为数值百分比的问题而用不到索引。


没意义


推荐阅读:
相关文章