2016-02-26 83 views
2

据我所知,当记录是连续的时,比InnoDB的主键索引更具有表现性。MySQL中的“几乎连续”主键的性能(InnoDB索引)

但是,我很好奇InnoDB主索引的性能值是几乎连续的值。假设我没有使用auto_increment,而是使用一些存储为BINARY(16)的应用程序端顺序UUID方案,如this excellent article中所述。

如果记录几乎不相当连续,那么这对存储和查询性能意味着什么?

+0

为什么是InnoDB的主键索引远时,记录比当他们是随机的顺序更好的性能? – Strawberry

+0

这只适用于插入。 – EJP

回答

0

您可以通过杰里米·科尔

http://blog.jcole.us/2013/01/10/the-physical-structure-of-records-in-innodb/

Anyawy找到有关InnoDB的指数这个有趣的文章中详细和有用的信息做的事实索引是一个B +树索引结构的基础是什么,你肯定

的记录是几乎但并非十分顺序

不改变性能,因为顺序方面不符合该领域的含义(1,2,3而不是1,5,7),而是取决于价值的“分配”。在这种情况下,您展示的两种情况在分配价值方面是相同的。

0

“计数磁盘命中数”。

案例1:所有的数据和索引都符合innodb_buffer_pool_size
行和/或索引的排序并不重要。 (没有磁盘命中,除非最终将所有内容保存到磁盘。)

情况2:数据和/或索引太大,无法放入buffer_pool。情况2a:数据/索引是连续的,或接近连续的或具有有限数量的“热点”。
将有一个或“有限数量”的块获取所有活动。这些(大概)很容易适应buffer_pool。所以,没有性能问题。情况2b:数据/索引是随机的(例如,UUID或MD5)。
现在,由于数据/索引太大而不适合,并且插入随机跳跃,因此将会有大量的I/O来完成工作。 I/O是性能杀手。 (由于包含“下一个”UUID的块不太可能缓存在buffer_pool中,因此需要读取,修改并最终写回到磁盘。)

数据(在InnoDB中)按PRIMARY KEY在一个BTree。每个“次要”指数都在它自己的BTree中。

现在,让我们分手的问题的不同方式...

案例1.你只有一个PK,无二次键。
如果在加载之前通过PK对数据进行排序很容易,这将使负载运行得更快。 (填写块,写入磁盘;重复,无法获得更少的磁盘命中)

案例2.您有一个AUTO_INCREMENT PK,再加上一个辅助密钥。
在这种情况下,如果你预先排序的二级钥匙,让AUTO_INCREMENT做它的事,它会跑得快。情况3:如果您有两个具有不同特性的密钥(PK和/或次级密钥),例如时间戳和UUID,则
您被卡住了。你可能会尝试预排序一个去优化它,但是,其他的将是随机的和缓慢的。 (作为一个指标,对其他低效有效。)

回到你的问题。 “几乎连续”可能意味着你没有碰到许多不同的块。例如,如果你有一年的价值的数据,以及PK是一个时间戳,但每一天的数据混乱,然后就是“差不多排序”。在任何时候,你只是在一天的价值中跳跃,而不是全年。