MYSQL索引命中率

一、MySQL 索引类型

   1、从物理存储角度上,索引可以分为聚集索引和非聚集索引。

①. 聚集索引(Clustered Index)

聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。

②. 非聚集索引(Non-clustered Index)

非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据

2、逻辑角度,索引可以分为以下几种。

①普通索引:最基本的索引,它没有任何限制。

②唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

③主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用     primary key 来约束。主键和聚集索引的关系详见“问题详解”中的第4题。

④联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。

⑤全文索引:老版本     MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。

二、索引优化规则

1.前导模糊查询不能使用索引。

2.union、in、or 都能够命中索引,建议使用 in。

3.负向条件查询不能使用索引,可以优化为 in 查询。

4.联合索引最左前缀原则(又叫最左侧查询)

5.范围列可以用到索引(联合索引必须是最左前缀)。

6.把计算放到业务层而不是数据库层。

7.强制类型转换会全表扫描

8.更新十分频繁、数据区分度不高的字段上不宜建立索引。

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

10.如果有 order by、group by 的场景,请注意利用索引的有序性。

11.使用短索引(又叫前缀索引)来优化索引。

12.建立索引的列,不允许为 null。

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

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

15.超过三个表最好不要 join。

16.如果明确知道只有一条结果返回,limit 1 能够提高效率。

17.SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。

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

19.单索引字段数不允许超过5个。

 

20.创建索引时避免以下错误观念

  • 索引越多越好,认为一个查询就需要建一个索引。

  • 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。

  • 抵制惟一索引,认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。

  • 过早优化,在不了解系统的情况下就开始优化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章