网站首页 > 博客文章 正文
索引原理
索引的原理类似于书的目录结构,通过目录可以快速地定位到对应的章节,而不需要从头到尾翻阅每一页去查找。它会提前对设定的索引列进行排序和组织,形成一个类似于目录的结构,这样在查询的时候,利用二分法或其他算法,快速的检索到对应的数据,而不需要遍历整个表数据。
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. 数据库参数设置不合理
数据库有一些参数会影响查询的执行计划和性能,例如优化器模式、并行度、缓存大小等。如果这些参数设置不合理,可能会导致查询选择了一个低效的执行计划,或者无法充分利用数据库的资源。因此,需要根据数据库的实际情况,合理地调整这些参数。
猜你喜欢
- 2024-10-27 Elasticsearch 在地理信息空间索引的探索和演进
- 2024-10-27 终于有人把Elasticsearch原理讲透了(二)
- 2024-10-27 PostgreSQL技术内幕6:PostgreSQL索引技术
- 2024-10-27 ElasticSearch的分布式架构原理(吐血整理!)
- 2024-10-27 「漫画」elasticsearch原理就是这么简单(上)
- 2024-10-27 Elasticsearch读书笔记(二)(elasticsearch 书推荐)
- 2024-10-27 搜索引擎原理系列教程:收录、索引、排名
- 2024-10-27 什么是预处理: 预处理简称为“索引”
- 2024-10-27 陈年SEO:解密百度SEO排序影响因素
- 2024-10-27 Archer:奇麟数仓倒排索引设计实现
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 358℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)