【发布时间】:2012-01-27 21:32:40
【问题描述】:
我有以下 MySQL 查询:
SELECT value_1, (
SELECT value_4
FROM table_1
WHERE value_3 < value_1
ORDER BY value_3 DESC
LIMIT 1
)
AS result_value
FROM table_2
WHERE value_1 BETWEEN 1325372400000 AND 1328050800000
ORDER BY value_1
返回 32 个结果,运行时间为 6.6 秒。这个想法是从 table_1 中获取条目,其中 value_3 与 table_2 中的 value_1“最接近”。
查询由两个查询组成,即
SELECT value_1
AS result_value
FROM table_2
WHERE value_1 BETWEEN 1325372400000 AND 1328050800000
ORDER BY value_1
和(例如)
SELECT value_4
FROM table_1
WHERE value_3 < 1328050800000
ORDER BY value_3 DESC
LIMIT 1
每次运行需要 0.03 秒。计算 32 个结果集的累积时间,复合查询应该不会超过 1 秒,甚至可能更短(因为单个查询的 I/O 开销没有考虑在内)。然而,在 6.6 秒时,它需要的时间要长得多。
为什么会这样,我该如何优化它?还是有其他/更好的方法来实现我的目标?
更新:
表定义:
table_1(MyISAM,700000 个条目):
'id', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment'
'value_3', 'bigint(20) unsigned', 'NO', 'UNI', '0', ''
'value_4', 'bigint(20) unsigned', 'NO', '', '0', ''
table_2(MyISAM,4000 个条目):
'value_1', 'bigint(20) unsigned', 'NO', 'PRI', NULL, ''
解释[查询]:
'1', 'PRIMARY', 'table_2', 'range', 'PRIMARY,value_3_UNIQUE', 'PRIMARY', '8', NULL, '32', 'Using where; Using index'
'2', 'DEPENDENT SUBQUERY', 'table_1', 'index', 'value_3,value_3_value_4', 'value_3', '8', NULL, '1', 'Using where'
【问题讨论】:
-
你的表有什么索引?
-
你在
table_1上有一个(value3)索引吗?还是(value3, value4)? -
你能添加表格的定义吗?表格有多少行?
-
您的通用“价值观”并没有为我们提供您想要的真实背景。答案可能是以完全不同的方式处理您的查询。如果一些显示上下文的示例数据(有限,并且只有那些列可以理解)有时也会有所帮助。
-
我在 table_2 上有索引 value_1,在 table_1 上有 value_3 和 (value_3, value_4)。