什么情况下需要创建索引,索引应该怎么建效率最高?这是面试常见的问题,下面我们就一起来看看所以创建过程中应该注意些什么。
-
优先使用主键索引
一般来说主键是由一个业务对象的某一个或者多个属性组成的,其在业务上具有唯一标识的特性。例如一个User对象,userid用户ID可以唯一标识一个用户,可以作为主键。
在查询时,使用主键字段作为条件进行查询可以使用到主键索引,查询速度很快。 -
业务上具备唯一性的一个或者多个字段必须创建唯一键索引,这个规则不止是用于索引,也用于对业务唯一性进行数据库层面的控制。
-
单列等值和非等值的查询,需要为该字段创建索引,查询时会使用到该索引,提高查询速度。如下所示
select * from table where a=1; select * from table where a is null; select * from table where a is true; select * from table where a<=20;(<,<=,>,>=,!=,<>) select * from table where a between 10 and 20;(not between) select * from table where a like 'name%';(not like,注意a like '%name'无法使用索引)
-
使用and进行多列的等值查询,需要分别计算每列区分度,按照区分度从大到小的顺序添加索引。如下所示
-- 查询区分度 select count(distinct column)/count(*) from table; --根据区分度大小建立索引,a区分度0.9,b区分度0.85,建立联合索引(a,b) select * from table where a=1 and b=2;
-
使用and进行多列的非等值的查询,需要分别计算每列的区分度,为索引区分度最大的字段建立索引,或者为每个字段都单独建立索引。
--a区分度0.9,b区分度0.85,建立索引(a)或者(a)、(b) select * from table where a=1 and b=2;
-
等值查询和非等值查询组合时,先采用等值查询的方法确定索引字段,再采用非等值查询的方法确定索引字段,然后将两者组合在一起。
--a区分度0.9,b区分度0.85,c区分度0.8,d区分度0.9,建立索引(a,b,d) select * from table where a=1 and b=2 and c>1 and d<2;
-
索引设计时尽量使用覆盖索引,覆盖索引是指索引内容包含了所需要查询的值,这样子一来,指通过索引就完成了查询,不需要重新扫描原表,速度会更快,一般来说使用explain命令查询mysql的查询语句,如果使用到了覆盖索引,则extra列会提示:Using index
网友评论