mysql索引有哪几种(数据库中的索引,原理是什么为什么查询使用索引就会快)
本文目录
数据库中的索引,原理是什么为什么查询使用索引就会快
相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 B+ Tree 索引,索引可以加快数据库的检索速度,但是会降低新增、修改、删除操作的速度,一些错误的写法会导致索引失效等等。
但是如果被问到,为什么用了索引之后,查询就会变快?B+ Tree 索引的原理是什么?这时候很多人可能就不知道了,今天我就以 MySQL 的 InnoDB 引擎为例,讲一讲 B+ Tree 索引的原理。
索引的基础知识
MySQL 的基本存储结构是页,大概就是这个样子的:
在这里,我们需要了解以下几点(非常重要):
当我们用 MySQL 的 InnoDB 引擎创建表,有且只能有一个主键;如果我们没有显示地指定之间,那么MySQL 会自动生成一个隐含字段作为主键;
聚集索引:以主键创建的索引;聚集索引的叶子节点存储的是表中的数据;
非聚集索引:非主键创建的索引;非聚集索引在叶子节点存储的是主键和索引列;使用非聚集索引查询数据,会查询到叶子上的主键,再根据主键查到数据(这个过程叫做回表)。
页和页之间、页和数据之间的关系
我们以聚集索引做讲解,页和页之间、以及页和数据之间的关系是这样的:
数据页和数据页之间,组成一个双向链表;
每个数据页中的记录,是一个单向链表;
每个数据页都根据内部的记录生成一个页目录(Page directory),如果是主键的话,可以在页目录中使用二分法快速定位;
如果我们根据一个非主键、非索引列进行查询,那么需要遍历双向链表,找到所在的页;再遍历页内的单向链表;如果表内数据很大的话,这样的查询就会很慢。
B+ Tree 索引的原理
先让我们看看 B+ Tree 索引大概是什么样子(以聚集/主键索引为例):
假如这时候我们要查询 id = 16 的数据:
查询页-1,找到页-2 存储的是小于 30 的数据;
查询页-2,找到页-5 存储的是 10~20 的数据;
查询页-5,找到 id = 16 的数据。
很显然,没有用索引的时候,需要遍历双向链表来定位对应的页,而有了索引,则可以通过一层层“目录”定位到对应的页上。
为什么 B+ Tree 索引会降低新增、修改、删除的速度
B+ Tree 是一颗平衡树,如果对这颗树新增、修改、删除的话,会破坏它的原有结构;
我们在做数据新增、修改、删除的时候,需要花额外的时间去维护索引;
正因为这些额外的开销,导致索引会降低新增、修改、删除的速度。
思考题,欢迎留言讨论
现在你是否理解了 B+ Tree 索引的原理?
最后再留一个思考题:为什么官方建议使用自增长主键作为索引?大家可以在留言中写下你的答案。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注;关注我后,可私信发送数字【1】,获取海量学习资料。
Mysql中哪些场景下会导致使用了索引但索引失效,导致性能变差
以 Mysql 为例,其中索引 BTree 类型 。以下几种SQL设计会导致虽然使用了索引,但是索引不会生效,即引擎放弃使用索引而进行全表扫描:
- WHERE 子句中使用 != 或 《》 操作符。
- WHERE 子句中对索引列使用 %前缀模糊查询。
- WHERE 子句中对索引列使用 OR 来连接条件。
- WHERE 子句中对索引列使用 NOT IN。
- WHERE 子句中对索引列使用计算、函数、类型转换等操作。
- WHERE 子句中对索引列使用参数。
数据库的索引有什么用
首先,索引可以加快查询速度。所以它的存在大大的加快了数据返回的时间。但是,有时候也不能只看到它的好处,对于一张经常需要插入或更新较多的表,索引的维护也是很费性能的。根据自己业务所需,合理的使用索引,才是上策。希望能帮到你们,谢谢????
MySQL的索引是什么怎么优化
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方:
如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的 MySQL就是一个人力三轮车。索引分单列索引和组合索引。
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不 是组合索引。
- 组合索引,即一个索引包含多个列。
本文相关文章:
dropdownlist 绑定(DropDownList1怎么与数据库数据绑定)
2024年7月23日 18:32
kibana教程(如何用 Node.js 和 Elasticsearch 构建搜索引擎)
2024年6月29日 19:12
sql批量新增数据insert(SQLSERVER数据库中批量导入数据的几种方法)
2024年6月28日 17:35
分页查询语句(数据库语句当第一个查询语句数据不足时,如何按照第二个语句查询)
2024年6月28日 11:13
postgresql中文手册(postgresql 如何删除数据库)
2024年6月26日 10:08
mysql教程下载(如何快速有效地掌握数据库语言MySql)
2024年6月26日 07:31
如何使用数据库?数据库原理与应用教程第4版课后习题答案(何玉洁)
2024年6月26日 02:20
更多文章:
游戏法老王与埃及艳后,刚开始玩,它怎么总提示要建棚子和杂耍学校等娱乐设施呀,要建多少个才能过关?法老王的游戏攻略
2024年7月1日 04:33
nds模拟器中文版下载(nds模拟器下载最新,谁有啊~~可以发我一下吗或者连接都行)
2024年5月16日 12:33
奢侈品电商寺库疑似跑路,具体情况如何还有哪些信息值得关注?寺库危机不断:总部空了还拖欠货款,这一品牌为何会沦落至此
2024年6月24日 18:30
魔方网表五并发以下是免费的,请问功能上有什么限制吗?上次问的是云表和魔方网表,那么,云表和活字格哪个好用谁对比过
2024年7月24日 02:31