MySQL索引长度解释

标签 mysql database

看看下面的 3 个 MySQL 表,索引长度远大于实际行数是不是很典型?

在性能开始快速下降之前,索引的长度是否也有限制,例如第一个索引长度超过 2.06 亿的表?

table_rows  data_length index_length    Size in MB
7607749     5044389164  206542848       5007.68
3110749     1832710212  793864192       2504.9
4811507     1088374128  318001152       1341.22

最佳答案

table_rows 是表中的行数。这个数字对于 MyISAM 是准确的,但对于 InnoDB 来说只是近似值。 data_length 是表数据部分的字节数。对于 InnoDB,这包括 PRIMARY KEYindex_length 是索引的字节数(不是行数)(如果是 InnoDB,则不包括 PK)。

如果你有大量的索引,index_length 可以大于 data_length。这是一个线索,表明您可能有太多索引,但这不一定是“坏事”。

每个索引都存储为一个独立的 BTree。当你添加另一个索引时,你会得到另一个 BTree;这不会影响现有索引的性能。

您的表有几百万行;这意味着每个 BTree 大约有 4 层深。如果表增长到十亿行,它的 BTree 将增长到大约 5 级。这是次要的。

当事情变大时,就会发生退化。但这并没有那么简单。

示例 1:您的数据具有日期时间索引或 auto_increment PRIMARY KEY,并且您始终只查看“最近”的行。在这种情况下,“工作集”可能足够小以适合 RAM。随着数据和索引的增长,您不会注意到任何性能下降。

示例 2:某些查询需要扫描整个表或整个索引。这会耗尽缓存,性能会一落千丈。

示例 3:UUID 上的索引。这是一个非常随机的索引。您插入或选择的“下一个”UUID 与您最近接触过的其他 UUID 没有任何关系。因此,一旦数据/索引对于 RAM 而言太大,您可能需要访问磁盘。在这里,性能逐渐变差。

我的观点是,性能下降是数据/索引大小、访问模式、缓存大小和 RAM 大小的组合。不仅仅是您正在查看的数字。

关于MySQL索引长度解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156490/

相关文章:

MySQL 外键错误 1005 errno 150 主键作为外键

mysql - CakePHP 查找所有生成返回重复记录(具有相同 ID)的 SQL。查找列表没有

javascript - 搜索在多个 javascript 文件中使用一个 mongodb 连接的最佳实践

sql - ORA-12154 : TNS:could not resolve the connect identifier specified on a table

c# - 如何使用数据读取器 C# 发现空 Access 字段

mysql - 询问!我如何获得每个用户三张 table 的总餐费和费用!这是我的第一个问题,很抱歉给您带来不便

MySQL ERROR 2026 - SSL 连接错误 - Ubuntu 20.04

php - WHERE OR 子句无法正常工作

mysql - 如何计算 MySQL 结果中的 has-many-through 关系

mysql - 表中只有一个属性可以吗,还是被认为是糟糕的设计?