专业的编程技术博客社区

网站首页 > 博客文章 正文

MySQL 为什么使用数据索引能提高效率

baijin 2024-10-27 08:06:59 博客文章 3 ℃ 0 评论

索引原理

索引的原理类似于书的目录结构,通过目录可以快速地定位到对应的章节,而不需要从头到尾翻阅每一页去查找。它会提前对设定的索引列进行排序和组织,形成一个类似于目录的结构,这样在查询的时候,利用二分法或其他算法,快速的检索到对应的数据,而不需要遍历整个表数据。

1. 当我们执行查询语句时,如果没有索引,数据库需要逐行扫描整个表格来找到符合条件的数据。而有了索引,数据库可以根据索引的有序性,快速定位到符合条件的数据,从而大大减少扫描的时间。

2. 当我们对数据进行排序或分组时,如果没有索引,数据库需要额外的操作来进行排序或分组,这导致了额外的时间开销。而有了索引,数据库可以直接利用索引的有序性,快速对数据进行排序或分组。

3. 数据库通常存储在磁盘中,而在执行查询语句时,数据库需要将磁盘中的数据加载到内存中进行处理。如果没有索引,数据库需要加载整个表格的数据,而有了索引,数据库只需要加载索引中的相关数据,从而减少了磁盘IO的次数和时间。

索引类型

索引的本质是一个有序的指针集合,指向存储在磁盘上的数据。mysql 有很多类型的索引,每种索引也适用于不同的场景。

1. B-Tree 索引

使用B-Tree结构来存储键值对,其中键是索引列的值,值是指向数据行的指针。B-Tree索引可以支持范围查询、排序、分组等操作,但是对于非前缀匹配的查询效率较低。

2. Hash 索引

一种基于哈希表的索引类型,使用哈希函数将索引列的值映射到一个固定长度的哈希值,然后将哈希值和指针存储在哈希表中。Hash索引可以支持等值查询,查询速度很快,但是不能支持范围查询、排序、分组等操作,也不能利用索引缓存。

3. Full-Text 索引

是一种专门用于全文检索的索引类型,它使用倒排索引的方式来存储文本数据中的词语和出现位置。Full-Text索引可以支持模糊匹配、同义词、停用词等功能,适用于搜索引擎等应用场景。

建立索引原则

1. 在经常需要搜索的列上增加索引,比如 where 后面的条件,注意还要遵循最左原则

2. 在使用左外连接的列上建立索引

3. 高频查询的列,可以减少全表扫描的次数

4. 避免在频繁更新或删除的列上建立索引

5. 避免在大量重复值的列上创建索引

建立索引后还是慢的可能原因

首先查询慢有很多因素,除了本身的SQL外,还受服务器等多个因素影响。

1. 索引选择不合适

有时候,数据库优化器可能会选择一个不是最优的索引来执行查询,导致性能下降。这种情况下,可以尝试使用 hint 强制指定一个更合适的索引,或者调整索引的设计和统计信息。如果数据库没有建立正确的索引,查询可能需要遍历整个表,这会导致查询大数据量时会非常慢。可以在经常使用 Where、Order By 的列上创建索引。

2. 索引过多或过少

索引并不是越多越好,也不是越少越好。过多的索引会增加数据库的维护成本,影响数据的插入、更新和删除操作。过少的索引会导致查询无法充分利用索引,而进行全表扫描或全索引扫描。因此,需要根据查询的特点和频率,合理地创建和删除索引。

3. 查询条件不利于索引

有些查询条件会导致索引失效,例如使用了函数、表达式、隐式类型转换、逻辑非等操作。这些操作会使得数据库无法正确地利用索引的顺序和范围,而进行全表扫描或全索引扫描。因此,需要尽量避免这些操作,或者改写查询条件。如果你的 Sql 较为复杂,尤其是多表连接、子查询或复杂的 Where 条件语句都会导致查询缓慢。可以尝试将复杂的 Sql 分解为多个简单的查询。

4. 数据库参数设置不合理

数据库有一些参数会影响查询的执行计划和性能,例如优化器模式、并行度、缓存大小等。如果这些参数设置不合理,可能会导致查询选择了一个低效的执行计划,或者无法充分利用数据库的资源。因此,需要根据数据库的实际情况,合理地调整这些参数。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表