- 当使用索引列进行查询的时候,尽量不要使用表达式,把计算放到业务层而不是数据库层
select * from user where age + 1 = 2;
- 尽量使用主键查询,而不是其他索引,减少回表查询的触发
自然主键、代理主键(与业务层面无关,比如 id)
使用前缀索引
使用索引扫描来排序
explain …… /G
using filesort
- union all , in , or 都能使用索引,但推荐使用 in
如果是单列索引,or 会走索引的
如果是组合索引,所有列都必须包含(id 主键不算),or 才会走索引
- 范围列可以用到索引
范围条件是: >, >=, <, <=, between
范围列可以用到索引,但范围列后面的列无法使用到索引,索引最多用于一个范围列
- 强制类型转换、隐式类型转换会发生全表扫描(避免强制类型转换)
# 如果 phone 字段为 varchar 类型
# 不会走索引
select * from user where phone = 137……;
# 走索引
select * from user where phone = '137……';
- 更新十分频繁,数据区分度不高的字段上不宜建立索引
- 更新会变更 B+树,更新频繁字段建立索引会大大降低数据库性能
- 类似性别这类区分不大的字段,建立索引是没有意义的,不能有效过滤数据
- 一般区分度在80%以上的时候就可以建立索引,区分度可以用
count(distinct(列名))/count(*)
来计算
创建索引列,不允许为null,可能会得到不符合预期的结果
当需要进行表连接的时候,最好不要超过三个表,因为需要 join 的字段,数据类型必须一致
能使用 limit 的时候尽量使用 limit
单表索引尽量控制在5个以内
单索引字段数不允许超过5个(组合索引)
创建索引的时候应该避免以下错误概念
- 索引越多越好
- 过早优化,在不了解系统的情况下进行优化