索引规范

1.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引;

-> 尽量使用非空的唯一索引,尽量使用与业务无关的代理主键。

2.在varchar,text等长字符串类型字段上建立索引时,必须指定索引长度(前缀索引),没必要对全字段建立索引,根据实际文本区分度决定索引长度即可;

-> 使用select count(distinct left(列名, 索引长度))/count(*) from table测试确定索引的大概长度。

3.更新频繁,数据区分度不高的字段不适合建索引;

注:区分度可以select count(distinct(列名))/count(*) from table来查询,一般来说,区分度达到80%就可以建索引。

4.创建索引的列,应该不允许为null,可能会得到不符合预期的结果;

-> 最左匹配原则。

5.单表索引建议控制在5个以内;

6.如果某一些字段放在一起作为条件进行查询比较频繁,则可以考虑将单列索引升级为组合索引;

7.建组合索引的时候,区分度最高的字段在最左边 ;

8.对于组合索引来说,组合字段数不要超过5个;

9.存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置;

10.创建索引的时候应该避免以下错误概念:

索引越多越好;

过早优化,在不了解系统的情况下进行优化。

优化原则

1.使用索引列进行查询的时候不要使用表达式,把计算放到业务层而不是数据库层;

2.超过三个表禁止 join,需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引;

3.利用覆盖索引来进行查询操作,避免回表;

4.利用延迟关联或者子查询优化超多分页场景;

5.尽量使用主键作为条件查询,而不是其他索引,因为主键查询不会触发回表查询;

6.页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决

-> 最左前缀匹配原则,'%xxx'或者'%xxx%'会导致索引失效。

7.如果有order by的场景,请注意利用索引的有序性,order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能;

8.union all,in,or都能够命中索引,但是推荐使用in;

9.范围查询可以用到索引;

10.强制类型转换会导致索引失效,从而全表扫描;例如:把整型强制转换为字符串;

11.能使用limit的时候尽量使用limit;

12.SQL性能优化的目标:至少要达到range级别,要求是ref级别,如果可以是const最好;