【发布时间】:2012-11-10 21:41:52
【问题描述】:
我有两个表 testa 和 testb。
CREATE TABLE `testa` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `testb` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT NULL,
`aid1` INT(10) DEFAULT NULL,
`aid2` INT(10) DEFAULT NULL,
`aid3` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`)
);
目前,我正在运行下面的查询,以检索 testa 表中的 id 与 tableb 中的aid1、aid2、aid3 的任何列匹配的所有行。该查询正在检索准确的结果,但执行至少需要 30 秒,这太多了。我也尝试使用 UNION 优化我的查询,但没有这样做。
SELECT a.id, a.name, b.name, b.id
FROM testb b
INNER JOIN testa a ON b.aid1 = a.id OR b.aid2 = a.id OR b.aid3 = a.id ;
如何优化我的查询,使其总执行时间在 2-3 秒内?
提前谢谢...
解释结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ALL idx_aid1,idx_aid2,idx_aid3 (NULL) (NULL) (NULL) 10940
1 SIMPLE a ALL PRIMARY (NULL) (NULL) (NULL) 7512 Using where; Using join buffer
【问题讨论】:
-
从 cmets 到其他答案,如果您可以显示一些您尝试获取的示例数据(不暴露实际隐私类型信息),将会更有帮助。另外,澄清“A”与“B”表的预期内容。如果我们知道这个抽象的上下文,它也可能有助于替代解决方案。
-
testa 和 testb 表分别有多少行?
-
testa - 7600 & testb - 11000
-
还有一个问题:如果您仅使用 3 个字段中的一个字段(如aid1)加入,它是否运行速度快并使用索引?换句话说,
EXPLAIN ANALYZE SELECT a.id, a.name, b.name, b.id FROM testb b INNER JOIN testa a ON b.aid1 = a.id是否显示使用索引? -
是的,它使用索引 idx_aid1。但是当我将所有三列与 OR 一起使用时,它会花费太多时间。
标签: mysql performance select query-optimization