为什么MySQL单表不能超过2000万行?

是的,这就是问题所在。
MySQL单表行数超过2 000万行,存在很多问题。

1 .索引很深,搜索速度很慢,但现代硬件可以解决这个问题。
2 、SMO并发控制,高并发下悲观锁阻塞,性能崩溃。
3 、InnoDB索引表节点小,SMO多,无法写入。
4 、对比实验表明,GaussDB比MySQL更强大,TPS稳定。
5 、总结:拆分表和数据库,或者修改数据库,不用纠缠它。

你自己看看,它们是分区域的吗?

全面透彻,深刻理解 MySQL 索引

老实说,理解 MySQL 索引的关键是了解它们如何工作以及它们的速度有多快。

具体做法如下:
B-tree 和 B+-tree:MySQL 索引主要使用这两种类型。
B-Tree 和 B+ Tree 都非常清晰,可以让您快速搜索、添加和删除内容,而不必单独搜索所有内容,节省时间。
B+树更好:B+树的特殊之处在于,所有真实数据都放在叶子节点上,并且叶子节点仍然像链表一样连接和排序。
因此,检查距离数据非常快。
例如,要检查特定的时间范围,只需读取链表即可,无需一次又一次地翻页,节省了大量的磁盘操作。

多快:
缓存:MySQL 有缓存。
当经常检查的东西时,它们会存储在内存中。
下次查的时候直接从内存中获取,这比在磁盘上找要快很多。
就近查找:计算机科学中有一个说法叫“局部性原理”,意思是我们喜欢把相关的东西放在一起。
MySQL 也这样做,所以当你查找它时,你可以立即获得更多你需要的内容,而不必不断地跳转,而且阅读速度更快。

InnoDB 是这样实现的:
聚集索引:InnoDB 存储引擎使用聚集索引,这意味着数据行按主键顺序存储。
通过检查主键,可以直接找到该行数据,而不必一直查找。
二级索引:二级索引存储的是主键值,而不是真正的数据。
检查时,首先需要通过二级索引找到主键值,然后使用主键值找到聚集索引中的实际数据。
普通索引:普通索引可以多列搜索,搜索范围可以更窄,速度更快。

优化核心:
使用更少的磁盘:索引优化最基本的目的是使用更少的磁盘进行搜索。
硬盘是数据库缓慢的主要原因。
设计良好的索引可以允许搜索尽可能远地发生在内存中,从而尽可能减少移动磁盘的需要。

总之,要了解MySQL索引,你需要知道它的底层结构是什么样的,如何使用缓存并快速找到附近的东西,InnoDB如何设计索引,以及为什么需要使用更少的磁盘。
了解了这些事情之后,遇到问题的时候就可以安心了。

面试官:什么是 MySQL 的“回表”?

请告诉我,我当时在这个问题上犯了很多错误。
记得2 01 3 年的上海,电商系统的数据量与日俱增,查询速度非常慢。
老板很关心,让我找出原因。

经过一番研究,我发现很多地方都使用了非聚集索引。
这样一来,我们查完数据后,每次都要“回表”,从聚集索引中取出主键数据,造成大量的IO操作。
我提到B+Tree只有2 -4 层,但是由于表返回,数据检查可以一次运行多个层,这就像爬山一样。

对于 B+Tree 层中到底可以存储多少数据,您的示例非常正确。
我当时也是这样算的。
如果一个页面为 4 KB,每条记录为 1 KB,则该页面上可以存储 1 6 条记录。
主键为8 字节,指针为6 字节。
理论上,单层可以存储大约 2 1 00 万个条目。
但是,请记住,在实际使用中,指针可能大于 6 个字节,并且还需要考虑其他开销。
但一般来说,对于千万级数据来说,两到四层就足够了。

非聚集索引可靠地返回表,除非查询的列恰好位于索引中。
例如,我们有一个复合索引('user_id','order_date')。
如果检查 WHERE user_id = 1 00 AND order_date = '2 02 3 -1 0-2 6 ' 则可以直接使用该索引,而无需返回表。
但是,如果我只想检查 WHERE order_date = '2 02 3 -1 0-2 6 ',我必须先找到非聚集索引中的所有 user_ids,然后再返回表获取主键,这是非常耗时的。

另外,我建议使用自动增量主键。
当时,我尝试使用 UUID,但查询结果非常慢,并且返回表抑制了一切。
然后我改用自动递增 ID,这将层数减少了一半,并使查询速度更快。
当然,你也可以使用时间戳作为主键,除非是特殊的业务场景,比如需要按时间排序。

归根结底,回表是数据库必须在多个索引之间来回检索数据的过程。
了解这一点将帮助您知道优化时应将精力集中在哪里。
你还在踩陷阱吗?嗯,这种情况有时会发生,但不再是一个大问题了。

学习小林coding 3.3 为什么MySQL采用B+树作为索引?

显然,MySQL选择B+树作为索引结构,其实很简单。
它主要是为了满足数据库索引的两个核心需求:减少磁盘IO操作和高效执行查询操作。

我们先来说说最重要的事情。
B+树可以降低树高,减少磁盘IO。
想象一下,我们去年运行的一个项目有大约 3 000 级数据。
B+树可以将树高控制在很低的水平。
这样,在进行查询时,读取磁盘的次数就减少了,查询速度自然也就更快了。

还有一点是B+树的非叶子节点只存储索引,节省内存。
这就好比我们在一本书里放了书签,只标记重要的页码,而不是整本书的每一页,这样查找信息就更快了。

还有一个更重要的细节。
B+树的叶子节点形成有序链表,支持高效的范围查询。
例如,当你查看一段时间内的数据时,只需要从链表的一端开始,快速找到起点,然后按顺序遍历,而不需要像B树那样遍历整棵树。

我一开始以为B树、AVL树这样的自平衡树更适合做数据库索引,但后来发现是错误的。
即使他们保持树平衡,随着数据的增加,树的高度仍然会增加,影响效率。

等等,还有一件事,B+树的插入和删除效率也很高。
由于存在冗余节点,插入和删除操作不会对树结构产生太大影响。

所以,综上所述,B+树因其高度低、无叶子节点仅存储索引、叶子节点形成有序链表以及高效的删除和删除操作而成为MySQL索引结构的理想选择。
很多人没有注意到这一点,但我认为值得一试。