【发布时间】:2011-07-21 00:08:53
【问题描述】:
在花了很多时间处理这个问题的变体之后,我想知道是否有人可以帮助我优化这个查询或索引。
我有三个临时表 ref1、ref2、ref3,所有定义如下,ref1 和 ref2 各有大约 6000 行,而 ref3 只有 3 行:
CREATE TEMPORARY TABLE ref1 (
id INT NOT NULL AUTO_INCREMENT,
val INT,
PRIMARY KEY (id)
)
ENGINE = MEMORY;
慢查询是针对这样的表,大约有 1M 行:
CREATE TABLE t1 (
d DATETIME NOT NULL,
id1 INT NOT NULL,
id2 INT NOT NULL,
id3 INT NOT NULL,
x INT NULL,
PRIMARY KEY (id1, d, id2, id3)
)
ENGINE = INNODB;
有问题的查询:
SELECT id1, SUM(x)
FROM t1
INNER JOIN ref1 ON ref1.id = t1.id1
INNER JOIN ref2 ON ref2.id = t1.id2
INNER JOIN ref3 ON ref3.id = t1.id3
WHERE d BETWEEN '2011-03-01' AND '2011-04-01'
GROUP BY id1;
临时表用于将结果集过滤为用户正在寻找的项目。
解释
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| 1 | SIMPLE | ref1 | ALL | PRIMARY | NULL | NULL | NULL | 6000 | Using temporary; Using filesort |
| 1 | SIMPLE | t1 | ref | PRIMARY | PRIMARY | 4 | med31new.ref1.id | 38 | Using where |
| 1 | SIMPLE | ref3 | ALL | PRIMARY | NULL | NULL | NULL | 3 | Using where; Using join buffer |
| 1 | SIMPLE | ref2 | eq_ref | PRIMARY | PRIMARY | 4 | med31new.t1.id2 | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
(在具有约 500 万行 EXPLAIN 的不同系统上,在列表中首先显示 t1,并带有“使用位置;使用索引;使用临时;使用文件排序”)
我是否遗漏了一些明显的东西会阻止使用临时表?
【问题讨论】:
-
什么返回这个查询:
SELECT count(*) FROM t1 WHERE d BETWEEN '2011-03-01' AND '2011-04-01'?
标签: mysql performance