MySQL中哪些字段应该加索引

which fields should be add index in MySQL

Posted by alovn on October 20, 2021

高选择性

MySQL中并不是所有查询条件中出现的列都需要添加索引,对于什么时候添加B+树索引,一般的经验是:在访问表中某列有很少一部分值时使用B+树索引才有意义,最好是象主键一样取值范围很广,几乎没有重复值,属于高选择性。

对于像性别字段、地区等字段,它们的取值范围很小,称为地选择性,比如按性别进行查询时,可取值范围一般只有F、M。假如男女比例均衡的话,当我们进行下面查询时:

1
select * from user where sex='M';

那么我们大概会查询到这个表50%的结果,这时添加B+树索引是完全没有必要的。相反我们一般会对帐号添加唯一索引,它没有重复,这就是高选择性,这时的B+树索引是最合适的,也是最高效的。

Cardinality值

如何查看索引是否有高选择性呢?可以通过show index语句查看结果中的cardinality值。cardinality值表示索引中不重复数量的预估值,它不是一个准确值。

在生产环境中,有庞大的数据量,若进行一次完全的统计会花费较长时间也会给数据库带来很大的负担。这是不能接受的。MySQL是采用对数据采样的方式来统计cardinality值的。

cardinality值越接近于表中数据的数量越适合创建索引,也就是cardinality/rows_count的比值应尽可能的接近1。若比值足够小,那就需要考虑是否有必要创建这个索引。

在OLTP应用中,应该通过索引查询取得表中一小部分数据,一般10条或者更少,很多时候只取一条数据。这时建立B+树索引才有意义,否则即使创建了索引,优化器也可能选择不使用索引。

而在OLAP应用中,通常要访问大量的数据,提供某时间段内多维度上的分析,而很少需要对单个用户进行查询。这就需要根据具体情况具体分析了,不过通常会需要对时间字段进行索引。