索引规范
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最好;