And*_*ndy 4 mysql performance query-performance
我是一名 Web 开发人员(不是 DB 管理员!)在处理 MySQL 上的 1.7m 记录表时遇到性能问题。这是那个表:
CREATE TABLE `bbcmapimp_pc_raw` (
`postcode` char(8) NOT NULL,
`pc_sector` char(6) DEFAULT NULL,
`pc_district` char(4) DEFAULT NULL,
`pc_area` char(2) DEFAULT NULL,
`parliamentary_constituency_code` char(9) DEFAULT NULL,
`parliamentary_constituency` varchar(255) DEFAULT NULL,
`mp_name` varchar(255) DEFAULT NULL,
`district_code` char(4) DEFAULT NULL,
`district` varchar(45) DEFAULT NULL,
`country` varchar(255) DEFAULT NULL,
`suffix` char(5) DEFAULT NULL,
PRIMARY KEY (`postcode`),
KEY `pcc` (`parliamentary_constituency_code`),
KEY `suffix_index` (`pc_area`,`suffix`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我只需要迭代表,但在我第一次尝试时,我使用了 OFFSET,这太可怕了!从那以后,我了解了 MySQL 在引擎盖下所做的事情,并理解了为什么它变得越来越慢。
所以,我试图修改我的查询以使用 WHERE 子句,但问题是我按两个字段对查询进行排序(该表定义了一个复合索引)。
一种解决方案是添加一个按正确顺序排列的 ID 字段并使用它;但我想知道是否有任何方法可以在一个大于 WHERE 子句中指定复合索引的两个字段?
您可以使用
SELECT *
FROM `bbcmapimp_pc_raw`
WHERE (`pc_area`,`suffix`) > ('FO', 'BAR')
ORDER BY `pc_area`,`suffix`
Run Code Online (Sandbox Code Playgroud)
虽然实际上这似乎有一个更好的解释计划
SELECT *
FROM `bbcmapimp_pc_raw`
WHERE `pc_area` >= 'FO' AND (`pc_area` > 'FO' OR `suffix` > 'BAR')
ORDER BY `pc_area`,`suffix`
Run Code Online (Sandbox Code Playgroud)