[置顶] mysql索引原理和优化相关介绍

本文参考自 《Mysql技术内幕(第4版)》

  mysql索引原理和优化相关介绍

  • 不同存储引擎索引的实现细节

  1. 对于MyISAM存储引擎的数据表来说,数据表的数据行在数据文件中,索引值是在索引文件中,一个数据表可以有多个索引,但这些索引是在同一个索引文件中的;
  2. 对于InnoDB存储引擎的数据表,其数据行和索引值没有分开,所有的数据表都是存放在同一个数据文件中,可以通过配置是每个数据表存在一个单独的数据文件,即使这样其索引值和数据行还是在同一个数据文件中。

  • 索引的优点

  1. 单个数据表查询是,可以避免数据表的全表扫描,提高查询速度
  2. 多个数据表连接查询,对数据表编制索引之后,查询第一张表,对第一张表后面的表进行索引查询,避免全表扫描
  3. 对于MIN()、MAX()函数来讲,通过如果查询的值为索引列,那么可以大大提高速度  
  4. 对于ORDER BY 子句和GROUP BY子句进行排序和分组查询,使用索引可以避免逐行查询

  • 索引的缺点

使用索引,会导致数据表的插入、删除、修改速度降低,因为需要创建索引或者对现有的索引做出改变
创建索引会占用大量的磁盘空间,对于MyISAM来说,可能索引文件的大小会超过数据文件,对于InnoDB,索引占据存储空间的增大,会导

  • 怎么使用索引发挥优势

  1. 尽量为搜索、分类或分组的数据列编制索引,不要为作为输出显示的数据列编制索引
  2. 综合考虑数据列的维度势,维度指数据列中非重复值的个数,数据列中重复的值越少,使用索引时的效果越好,但某一数值在数据列中出现的次数超过30%时,mysql查询优化将会跳过索引,而是用全数据表扫描
  3. 对短小的值进行索引 短小意味着占据更小的磁盘空间,减少磁盘IO操作,同时有理由查询和比较;短小的键值可以是同一个索引块中容纳更多的索引值,这样可以加大在不从磁盘读取索引块前提下从内存中找到键值的概率
  4. 为字符串前缀编索引,很多情况下键值的前20个字符都是一样的,那么就不用为整个数据列编制索引,只需从第20个字符开始,减少IO输入输出,同时提高字符串查询时比较的速度
  5. 索引类型与可能进行的比较操作的类型保持一致
  6. 利用慢查询日志找出性能低略的查询 默认情况下,mysql慢查询日志命名为host-name_slow.log

你可能感兴趣的:(mysql,索引优化,索引原理)