背景
我有一个MySQL测试环境,其中的表包含2亿多行。在此表上必须执行两种类型的查询;
client_id
和的列表,sgtin
最多可容纳50.000个项目,我需要知道sgtin
表中存在哪些。client_id
和的列表,sgtin
最多可容纳50.000个项目,我需要提取整行。(商店,gtin ...)对于单个“ client_id”,该表可以增长到200+百万条记录。
测试环境
至强E3-1545M / 32GB RAM / SSD。InnoDB缓冲池24 GB。(生产将是具有192GB RAM的更大服务器)
表
CREATE TABLE `sgtins` (
`client_id` INT UNSIGNED NOT NULL,
`sgtin` varchar(255) NOT NULL,
`store` varchar(255) NOT NULL,
`gtin` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX (`client_id`, `store`, `sgtin`),
INDEX (`client_id`),
PRIMARY KEY (`client_id`,`sgtin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
测验
首先,我生成了随机的sgtin值,这些值分布在10个“ client_id”上,以用2亿行填充表格。
我创建了一个基准工具,该工具可以执行尝试的各种查询。另外,我还使用了解释计划来找出最佳性能。对于每次测试,该工具都会从我用来填充数据库的数据中读取新的随机数据。确保每个查询都是不同的。
对于这篇文章,我将使用28 sgtin
s。
临时表
CREATE TEMPORARY TABLE sgtins_tmp_table (`sgtin` …
Run Code Online (Sandbox Code Playgroud)