diff --git a/IndexesOptimization.md b/IndexesOptimization.md index a27046a..fe47a53 100644 --- a/IndexesOptimization.md +++ b/IndexesOptimization.md @@ -1,7 +1,7 @@ -# database optimization notes +# indexes optimization notes Just personal notes for my own convenience. -## 索引优化规则 +## indexes optimization rules - like 语句的前导模糊查询不能使用索引。 - union、in、or 都能够命中索引,建议使用 in。 @@ -28,20 +28,20 @@ Just personal notes for my own convenience. - 更新十分频繁、数据区分度不高的列不宜建立索引。 - 更新会变更 B+ 树,更新频繁的字段建立索引会大大降低数据库性能。 - “性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似。 - - 一般区分度在80%以上的时候就可以建立索引,区分度可以使用 `count(distinct(列名))/count(*)` 来计算。 + - 一般区分度在 80% 以上的时候就可以建立索引,区分度可以使用 `count(distinct(列名))/count(*)` 来计算。 - 利用覆盖索引来进行查询操作,避免回表,减少 `select *` 的使用。 - 索引不会包含有NULL值的列。 - - 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时,尽量使用not null 约束以及默认值。 + - 只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时,尽量使用not null 约束以及默认值。 - is null, is not null 无法使用索引。 -- 如果有 order by、group by 的场景,请注意利用索引的有序性。 +- 如果有 `order by、group by` 的场景,请注意利用索引的有序性。 - 使用短索引(前缀索引)。 - 利用延迟关联或者子查询优化超多分页场景。 - 如果明确知道只有一条结果返回,limit 1 能够提高效率。 - 超过三个表最好不要 join。 - 单表索引建议控制在5个以内。 -- SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。 +- SQL 性能优化 `explain` 中的 type:至少要达到 `range` 级别,要求是 `ref` 级别,如果可以是 `consts` 最好。 - 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。 - - 不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。 + - 不要以为唯一索引影响了 `insert` 速度,这个速度损耗可以忽略,但提高查找速度是明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。 - 创建索引时避免以下错误观念: - 索引越多越好,认为需要一个查询就建一个索引。 - 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。