为什么索引能提高查询速度?

上周朋友在谈论MySQL的存储结构时,提到了页的概念。
大家知道,MySQL的基本存储单元是存储记录的页。
这些页面可以构成一个双向链表,每一页上的记录都是单向链表。
每个页面还有一个页面目录,因此在通过主键查找记录时,可以利用二分法快速定位到对应的位置。

但是如果使用“select from user where name = '张三'”这样未经优化的SQL语句,查询效率会很低。
因为它会先遍历双向链表找到页面,然后再遍历单链表找到页面中的记录。
当数据量较大时,时间复杂度为O(n)。

但是如果我们使用索引,情况就不同了。
索引就像一个有序目录,它将无序数据转换为有序数据。
比如要查找ID为8 的记录,以前可能要遍历整个双向链表,但现在有了索引,直接通过目录就可以快速定位页面,时间复杂度约为O(logn)。

实际上,MySQL底层使用的是B+树数据结构。
B+树是一种可以快速查找匹配记录的树结构。
2 02 3 年,如果你对数据库感兴趣,了解这些底层结构会有帮助。
你明白了,你想深入研究吗?

干货篇:一篇文章让你——《深入解析MySQL索引原理 》

兄弟,咱们说点实际的吧。
之前做数据库优化的时候,索引有几次让我头疼。
要知道,对数据库建立索引就像把指南针扔进大海,让你快速找到你想要的鱼。

我记得当年我在一个电商平台,他们的数据库中的产品信息表有数百万条记录。
一开始没有索引,每次查询都像大海捞针一样,极其缓慢。
后来我在商品名称字段上添加了索引,查询速度提升了十倍以上。

但是,这个物品不能随便使用。
前面说过,索引有自己的存储方式,比如MyISAM和InnoDB,它们索引的存储文件也不同。
MyISAM 是.myd 和.myi,InnoDB 是.ibd。
两种设备以不同的方式处理数据。
InnoDB的索引采用B+Tree绑定,比MyISAM的索引结构更复杂,但查询效率更高。

我们来谈谈索引的结构。
事实上,它就像一棵树的形状。
Beetree 是我最喜欢的,因为它可以保持数据有序并快速查询。
但如果数据量太大,BTree的深度也会增加,从而影响效率。
因此,我通常会对BTree进行优化,比如使用叶子节点通过指针链接的B+Tree,让你可以一次检查一整个区域的数据。

说到这里,我突然想起一个危险,就是读取节点数据的过程。
BTree节点数据是封闭的,每次IO读取都会消耗性能。
我记得有一个酒吧,我定制了一张大桌子。
由于节点太大,每个IO都需要多次读取,效率极低。

然后还有一点,就是B+tree的优化。
之前我尝试过减小节点大小,提高IO读取效率,发现效果还不错。

最后说一下MyISAM和InnoDB,当MyISAM没有主键时,查询会很慢,因为它是非聚集索引。
InnoDB必须有主键,因为它是聚集索引,数据是按主键顺序存储的。

说到这里,我突然想起一个危险,那就是InnoDB表必须有主键。
有一次,我忘记为 InnoDB 表设置主键。
结果数据库初始化失败,因为InnoDB默认的主键创建策略有问题。

嘿,我自己也曾踩过这些危险。
我希望它们能够对您有所帮助。
如果你想问什么,就问吧。

为什么数据库索引查询会快

直接给出结论。

与varchar相比,char占用固定的空间。
varchar 变得更长。

5 00万行记录,无索引。

ID排序,二分查找2 0块。
firstName 是无序的,线性搜索 1 00 万个块。

创建索引firstName,索引记录5 4 字节,锁定因子1 8 ,共有2 7 7 7 7 8 个锁。

使用索引进行firstName二分查找,1 9 块加1 块,总共2 0块。

创建索引的优点: 1 .搜索速度快,尤其是排序和常用搜索栏。
2 、连接速度快,常用外键。
3 、范围查询速度快,索引有序。
4 .排序速度快,采用索引排序。

如果没有创建索引: 1 .列很少使用,索引没有用。
2 、数据值列较少,如性别,占比较高,指数增益较低。
3 .文本/图像/位类型,数据量大或值小。
4 、变化比查询大很多,索引降低了变化的性能。

索引类型: 1 .普通索引:CREATE INDEX。
2 . 唯一索引:CREATE UNIQUE INDEX。
3 、主键索引:PRIMARY KEY。
4 . 组合索引:ALTERTABLE ADD INDEX(name(1 0), city,age)。

组合索引采用最左前缀原则。
SELECT FROM mytable WHERE username="admin" AND city="Zhengzhou" 将被使用。

直接做。