高强度训练第十九天总结:

为什么要用索引

  • 通过创建唯一性索引可以保证数据库表中每一行数据的唯一性
  • 可以大大加快数据的检索速度(大大减少了检索的数据量),这也是创建索引最主要的原因。
  • 帮助服务器避免排序和临时表
  • 将随机IO变为顺序IO
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

索引这么多优点,为什么不对表中的每一个列创建一个索引呢?

  • 当表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据维护的速度。
  • 索引修啊占物理空间,除了数据表占数据空间之外,每一个索引还需要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 创建索引和维护索引需要耗费时间,这种时间随着数据量的增加而增加。

索引是如何提高查询速度的?

  • 将无序的数据变成相对有序的数据(就像查目录一样)

使用索引的注意事项

  • 在经常需要搜索的列上,可以加快搜索的速度
  • 在经常使用where子句的列上面创建索引,加快条件的判断速度。
  • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询的时间
  • 对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引
  • 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
  • 避免where子句中对字段施加函数,这会造成无法命中索引
  • 在使用InnoDB时使用与业务无关的自增主键为主键,即使用逻辑主键,而不要使用业务主键。
  • 将打算加索引的列设置为NOT NULL,否则将导致引擎放弃使用索引而进行全表扫描
  • 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗MySQL5.7可以通过查询sys库中的chema_unused_indexes视图来查询哪些索引从未被使用
  • 在使用limit offset 查询缓慢时,可以借助索引来提高性能。

MySQL 索引主要使用的俩种数据结构

  • 哈希索引 对于哈希索引来说,底层的数据结构就是hash表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景建议选择BTree索引。
  • BTree索引 Mysql的Btree索引使用的时B树中的B+Tree,但是对于主要的俩种存储索引MyISAM和InnoDB的实现方式是不同的

MyISAM和InnoDB实现索引方式的区别

  • MyISAM:B+Tree叶结点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Treee搜索算法搜索索引,如果指定的Key存在,则取出其data域值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”

    SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • InnoDB:其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据库文件本身就是主索引。被称为聚簇索引。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄