第6章 数据库索引优化

MySQL的索引优化

MySQL支持的索引类型

B-tree的特点

  • 加快查询的速度
  • 更适合返回查找
第6章 数据库索引优化_第1张图片
enter description here

什么情况下用到B-tree

  • 全值匹配查询
  • 匹配最左前缀的查询
  • 匹配列前缀的查询
  • 匹配范围查找
  • 精确匹配左前并方位匹配另外一列
  • 只访问索引的查询

B-tree的限制

  • 如果是按照索引的最左列开始查找的,则无法使用索引
  • 使用索引时不能跳过索引中的列
  • Not in 和 <> 无法使用索引
  • 如果查询中又某个列的范围查询,则右边的列都无法使用索引

Hash索引

特点

基于Hash表实现的,只能查询条件精确的匹配。

对于Hash索引中所有的列,存储引擎都会为每一行计算一个Hash码,Hash索引中存放的就是Hash码。

限制

第6章 数据库索引优化_第2张图片
enter description here
  • Hash索引必须进行二次查找。

  • Hash索引无法用于排序

  • 只能进行全值匹配,不支持范围查找。不选择列重复的字段上加这个索引。

联合索引

什么是联合索引:

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

注意:

1、需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引
3、如果where条件中是OR关系,加索引不起作用
4、符合最左原则

如何选择索引列的顺序?

  • 经常被使用到的列优先(经常查询的放在最左面)
  • 选择性能高的列优先
  • 宽度小的列优先

覆盖索引

优点

  • 可以优化缓存,减少磁盘I/o
  • 可以减少随机I/O,将随机IO变成顺序IO
  • 可以避免对Innodb主键引起的二次查询
  • 可以避免MYISAM表进行系统调用

缺点

  • 存储引擎不支持覆盖索引
  • 查询使用了太多的列
  • 使用率了%like%查询

使用索引来优化查询

利用索引优化锁

  • 索引可以减少锁定的行数
  • 可以加快处理的速度,同时也加快了锁的释放

删除重复和冗余的索引

定期更新索引的统计信息以及减少索引碎片

analyze table table_name
第6章 数据库索引优化_第3张图片
建立了主键索引就没必要创建唯一索引了

代码实例

第6章 数据库索引优化_第4张图片
覆盖查询
第6章 数据库索引优化_第5张图片
查询所有的数据是无法使用覆盖索引的

使用索引引来优化索引

使用索引扫描来优化排序

  • 索引顺序和Order By 的子句的循序完全一致
  • 索引中所有的方向(升序、降序)和Order by 子句完全一致
  • Order by 中的字段全部在关联中的第一张表中

为什么使用索引

  • 加上存储引擎需要扫描数据的数量
  • 避免我们使用临时表
  • 可以把随机I/O变成顺序I/O

索引不是越多越好

  • 索引会增加写操作成本
  • 太多的索引会增加查询优化器选择的时间

索引优化策略

第6章 数据库索引优化_第6张图片
image
第6章 数据库索引优化_第7张图片
image

你可能感兴趣的:(第6章 数据库索引优化)