高性能使用索引①

121 阅读3分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

高性能使用索引①

索引三大优点:

  1. 索引大大减少了服务器需要扫描的数据量
  2. 索引可以帮助服务器避免排序和临时表
  3. 索引可以将随机io变为顺序io

那么如何高性能的使用哦索引呢?

独立的列

所为独立的列就是索引列不能是表达式的一部分,也不能是函数的参数。

使用前缀索引

索引的选择性越高查询效率越高,选择性高的所有让Mysql在查找时过滤掉更多的行。唯一索引的选择性是1,索引的选择性最好,性能也是最好的。

对于BLOB,TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为Mysql不允许索引这些列的完整长度。

选择合适的所有列顺序

索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列,来满足order by group by distinct等子句的查询

通常选择性最高的列放到索引最前列。

聚簇索引

聚簇索引不是索引类型而是一种数据存储格式。InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。

聚簇索引的数据行实际上存放在索引的叶子页中。表中只能有一个聚簇索引,因为无法同时把数据行放在不同的地方。

InnoDB通过主键聚集数据,没有主键InnoDB选择一个唯一的非空索引代替。如果没有唯一的非空索引,InnoDB隐式定义一个主键作为聚簇索引,InnoDB聚集在同一页面中的记录。

聚簇索引优点:

  • 可以把相关的数据保存在一起,通过磁盘读取少数的数据页就能获取指定数据
  • 数据访问更快。聚簇索引将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据比非聚簇索引中查找要快
  • 使用覆盖索引扫描的查询可以直接使用页节点中主键值。

聚簇索引缺点:

  • 聚簇数据最大限度提高了IO密集型应用的性能,当如果数据全部都放在内存中,聚簇索引没有优势

  • 插入速度依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。

  • 更新聚簇索引的代价高,强制InnoDB将每个被更新的行移动到新的位置

  • 基于聚簇索引的表在插入新行或者主键被更新导致需要移动行的时候,可能出现页分裂问题。当将一行插入到某个已满的页中,存储引擎会将该页分裂成两个页面来容纳该行,这就是页分裂,页分裂导致表占用更多的磁盘空间。

  • 聚簇索引导致全表扫描变慢,尤其是行比较稀疏或者页分裂导致数据存储不连续

  • 🎧非聚簇索引比想象的要更大,因为非聚簇索引的叶子节点包含了引用行的主键列。

  • 通过非聚簇索引查找行需要两次索引查找

非聚簇索引的叶子🍃节点保存的不是指向行的物理位置的指针,而是行的主键值。通过非聚簇索引查找行,先找到非聚簇索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找对应的行。对于InnoDB,自适应哈希索引可以减少二次索引。