MySQL索引介绍
01 MySQL的索引是什么?
-
在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
-
我们都知道,MySQL需要支持持久化,它把数据存储在磁盘中,使用索引可以减少查询的时间,而不使用索引的查询会更加耗时,因为MySQL需要扫描整个表。
-
我们知道,单纯的内存运算是很快的,但从磁盘中取数据到内存中是相对慢的,当表中有大量数据时,内存与磁盘交互次数大大增加,这就导致了查询效率低下。(所以将数据存到内存中的Redis数据库查询效率更高)
-
所以使用索引可以提高查询的性能,同时也可以提高查询的可读性和可维护性。
02 索引提高查询效率的原理
-
对MySQL数据库的操作相对于cpu和内存操作,磁盘IO(注释1)开销很大,非常容易成为系统的性能瓶颈,所以计算机操作系统做了一些优化(注释2),从而优化了数据访问的性能。
-
而索引提高查询效率的原理就是减少了查询过程中的IO次数,能够直接指引系统去寻找需要的数据,而不用每次都查找整个数据库。这样可以快速找到符合条件的数据,减少需要读取的数据量。
-
有了索引,系统可以直接跳到匹配数据位置,而不必对整张表进行扫描,避免了大量的磁盘IO操作。
-
索引将数据按照规则有序存储,使得查询时可以更有效地顺序读取数据,减少了随机IO操作,提高查询效率。
-
通过索引,系统能迅速定位到需要的数据页,减少了从磁盘读取数据的次数,减少了磁盘访问,提高了系统性能。
-
-
(注释1)磁盘IO开销是指计算机系统在进行输入/输出操作时,由于需要读取或写入数据到磁盘而产生的成本和开销。磁盘IO操作是指计算机通过磁盘进行数据的读取和写入,这种操作需要将数据从内存传输到磁盘或者从磁盘传输到内存,涉及到物理设备的读写过程,因此会消耗一定的时间和资源。
-
(注释2)当进行一次IO操作时,系统会将相邻的数据也读取到内存缓冲区中,而不仅仅是当前指定地址的数据。这是因为根据局部预读性原理,当计算机访问某个地址的数据时,与其相邻的数据很可能也会很快被访问到。在这种情况下,系统会将一整页数据(通常为4KB或8KB)一次性读取到内存中,这样实际上只发生了一次IO操作。
03 索引的优点和缺点
-
索引的优点:
- 保证数据不重复。
- 快速查找数据。
- 帮助连接表之间的数据。
- 减少查询中的排序和分组时间
-
索引的缺点:
- 创建和维护耗时随数据增加。
- 占用额外磁盘空间。
- 增删改数据时需要动态更新索引,降低数据维护速度
04 总结
- 谨慎选择索引字段,避免在重复度高的字段上添加索引。
- 定期检查和优化索引,确保索引的质量和适用性。
- 注意避免查询语句导致索引失效,避免不必要的索引,以提高查询效率。
- 对于增删改频繁的表,需要权衡索引对写入操作的影响,避免过度索引。