我们希望测试mysql数据库中用于主键/索引的序列/bigint vs UUID(VERSION-4) VS UUID(version-7)的性能。对于mysql来说是个新手,很难找到一种简单的方法来轻松地创建数据卷,测试性能,并且“解释分析”在这里似乎也不起作用。基本上想做一些类似于下面的代码在postgres.Can中所做的事情,请在这里指导我?
(UUID Version-4是默认的随机UUID版本,Version-7是时间戳排序的UUID,它比随机的UUID更有顺序,因此在缓存方面更好)。希望以某种方式在mysql中生成这些数据并进行测试。
下面的代码在postgres中工作得很好,我想模仿mysql中类似的代码来测试UUID序列的性能,以便生成、插入和查询。
CREATE UNLOGGED TABLE bigint ( id bigint PRIMARY KEY);
CREATE UNLOGGED TABLE uuid7 ( id uuid PRIMARY KEY);
create sequence myseq cache 32767;发布于 2023-02-13 17:29:06
(评论太多了。)
“缓存”--确保使用至少两倍于innodb_buffer_pool_size中的数据进行测试。否则,大部分或全部数据将被缓存,您将不会看到太大的差别。
由于"100000“行可能无法填充默认的buffer_pool_size,因此您可能希望降低测试的设置。(一定要将其包括在测试计划中。)
"generate“和"nextval”函数是否存储函数?UDF?客户代码?请包括这段代码。
没有LIMIT的ORDER BY是不现实的--你可以得到一些is的子集。它们通常(但不一定)有连续的ids。
IN ( SELECT ... )是一个臭名昭著的坏表演者。用不同的方式来制定测试,这样它就不会受到这个问题的影响。
BIGINT --几乎没有任何应用程序需要比4字节INT (BIGINT的8字节)更适合的应用程序。
EXPLAIN ANALYZE不一定会为您提供性能方面的线索。如果估计,有时很差,各种各样的事情。实际上,您必须对查询进行计时才能获得有用的结果。
“时间戳排序的UUID”--只有在访问模式是基于时间的情况下才与此相关。一个例子:一个新闻网站通常会被探测到“最近”的文章。一定要模拟这两种使用模式。
SELECT * --需要详细信息。至少有3个不相关的问题可能影响基准。() *是否如此小以至于INDEX“覆盖”?() *是否包含任何TEXT或BLOB列,从而导致“非记录”获取,这将是所需时间的重要部分。(*)其他。
UNLOGGED不是MySQL术语。
使用AUTO_INCREMENT,而不是SEQUENCE。(以及一些语法更改。)
为了比较-4和-7,您需要(1)表中的行比buffer_pool中的行多,(2)支持按时间聚集的索引的访问模式。
MySQL几乎没有你在其他地方找到的功能。唯一的问题是BENCHMARK(expression, count),它可能对您的任务没有什么用处。存储的例程可以做一些您需要的事情,但是它们不能接受或返回“数组”。MariaDB有伪表,如seq_1_to_100000。
https://dba.stackexchange.com/questions/323435
复制相似问题