mysql 通过索引进行优化

前面说了mysql的索引为啥用B+树,下面来说说索引的分类

索引一般分为以下几类:

  主键索引:当创建表的时候如果包含主键,数据库就会默认给主键添加索引

  唯一索引:表中唯一列添加的索引

  普通索引:又叫二级索引或者辅助索引,表示的是除了主键、唯一键添加的索引

  全文索引:一般在varchar、char或者text这样的类型里面才会建全文索引,全文索引类似于全文检索

  组合索引:一般在创建索引的时候都会选择单列,在某些情况下需要给多个列添加一个索引,此时组成了组合索引

了解完索引,再看看索引中常用的几个技术名词

  回表:先通过数据库索引扫描出数据行所在的行,再通过主键id取出索引中未提供的数据,即基于非主键索引查询需要多扫描一棵索引树

  覆盖索引:和回表相反的概念,在索引的叶子节点中如果能获取到查询的所有列数据,无需回表的过程称之索引覆盖。注意:在大多数存储引擎中,覆盖索引只能覆盖那些只访问索引中部分列的查询。不过,可以进一步的进行优化,可以使用innodb的二级索引来覆盖查询

  最左匹配:在一个表中,如果有组合索引,组合索引在进行查询时,遵循最左匹配原则,表示必须要先匹配到第一列之后才开始匹配第二个列,无法直接匹配第二个列的值

  索引下推:5.6之后新增的功能,数据筛选的过程下移到存储引擎层来完成,而不是在server层,注意:索引下推一定是在联合索引的情况下,根据联合索引本身就有的数据直接做一次过滤,而不用再进行多次无用的回表再到Server层进行过滤,explain看执行计划的时候,Using index condition并不代表一定是使用了索引下推,只是代表可以使用,但是不一定用了

  聚簇索引与非聚簇索引:所谓的聚簇索引并不是单独的索引类型,而是一种数据存储方式,指的是数据跟对应的索引列紧凑的存储在一起,非聚簇索引指的是数据跟索引分开存储

优化细节:

  1 当使用索引进行查询不要使用表达式,把计算放在业务层

  2 尽量使用主键查询,而不是其他索引,主键查询不会触发回表操作

  3 要创建索引的字符串比较长的时候,可以考虑使用索引前缀来创建,提高数据检索的效率

  4 使用索引扫描来排序

  5 union all,in,or都能够使用索引,但是推荐使用in(绝大数in比较快)

  6 范围列可以用到索引,索引最多用于一个范围列

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

  8 更新频繁不适合索引

  9 创建索引的列,不允许为null

  10 表连接最好不要超过三张表

  11 能使用limit尽量用limit

  12 单表索引建议在5个字段之内

  13 对于组合索引来说,单索引字段数不允许超过5个

  14 创建索引避免以下错误概念: 索引越多越好;过早优化,在不了解系统的情况下优化

 

 

  

posted on 2022-01-16 23:45  胡子就不刮  阅读(113)  评论(0编辑  收藏  举报

导航