【发布时间】:2012-04-24 16:37:44
【问题描述】:
我使用慢查询日志对我的数据库进行了性能分析。原来这是第一大烦恼:
UPDATE
t1
SET
v1t1 =
(
SELECT
t2.v3t2
FROM
t2
WHERE
t2.v2t2 = t1.v2t1
AND t2.v1t2 <= '2012-04-24'
ORDER BY
t2.v1t2 DESC,
t2.v3t2 DESC
LIMIT 1
);
子查询本身已经很慢了。我尝试了 DISTINCT、GROUP BY 和更多子查询的变体,但在 4 秒内没有执行任何操作。例如下面的查询
SELECT v2t2, v3t2
FROM t2
WHERE t2.v1t2 <= '2012-04-24'
GROUP BY v2t2
ORDER BY v1t2 DESC
需要:
mysql> SELECT ...
...
69054 rows in set (5.61 sec)
mysql> EXPLAIN SELECT ...
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
| 1 | SIMPLE | t2 | ALL | v1t2 | NULL | NULL | NULL | 5203965 | Using where; Using temporary; Using filesort |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
mysql> SHOW CREATE TABLE t2;
...
PRIMARY KEY (`v3t2`),
KEY `v1t2_v3t2` (`v1t2`,`v3t2`),
KEY `v1t2` (`v1t2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 77070 |
+----------+
SELECT COUNT(*) FROM t2;
+----------+
| COUNT(*) |
+----------+
| 5203965 |
+----------+
我正在尝试获取最新条目 (v3t2) 及其父条目 (v2t2)。应该没什么大不了的吧?有没有人建议我应该转动哪些旋钮?非常感谢任何帮助或提示!
这应该是更合适的 SELECT 语句:
SELECT
t1.v2t1,
(
SELECT
t2.v3t2
FROM
t2
WHERE
t2.v2t2 = t1.v2t1
AND t2.v1t2 <= '2012-04-24'
ORDER BY
t2.v1t2 DESC,
t2.v3t2 DESC
LIMIT 1
) AS latest
FROM
t1
【问题讨论】:
-
您的子查询在
PRIMARY KEY(v2t2) 上进行过滤。为什么ORDER BY和LIMIT在里面?您确定您发布的查询和表定义正确吗? -
您的第二个 SELECT 与您的问题 SELECT 完全不同(没有 LIMIT、没有 JOIN 等)。优化器别无选择,只能进行表扫描,因为您有效地要求了所有行。尝试对实际的问题查询进行 EXPLAIN。
-
这些名字
v1t1, v2t1, v1t3, ..., v7t3看得我眼花。 -
@MarkBrackett 在我的 MySQL 版本中,我无法对 UPDATE 语句执行 EXPLAIN。这就是为什么我尝试构建一个结果与我的子查询中的结果相似的查询。
-
@openHaus - 在您的 UPDATE 语句中解释 SELECT 子查询。您的“相似”查询缺少子查询的许多运算符,这是必须进行任何优化的地方。
标签: mysql sql optimization indexing