Skip to content

Commit

Permalink
update IndexesOptimization.md #1
Browse files Browse the repository at this point in the history
  • Loading branch information
wanglekai committed Jan 9, 2021
1 parent d4f6d4c commit 3d72d22
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions IndexesOptimization.md
Original file line number Diff line number Diff line change
@@ -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。
Expand All @@ -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` 速度,这个速度损耗可以忽略,但提高查找速度是明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。
- 创建索引时避免以下错误观念:
- 索引越多越好,认为需要一个查询就建一个索引。
- 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。
Expand Down

0 comments on commit 3d72d22

Please sign in to comment.