我来自 Postgres 背景并试图将我的应用程序转换为 MySQL。我有一个查询,它在 Postgres 上非常快,在 MySQL 上非常慢。在做了一些分析之后,我确定了导致速度差异巨大的一个原因是嵌套查询。以下伪查询在 Postgres 上需要 170 毫秒,在 MySQL 上需要 5.5 秒。
SELECT * FROM (
SELECT id FROM a INNER JOIN b
) AS first LIMIT 10
在 MySQL 和 Postgres 上,以下查询的速度相同(小于 10 毫秒)
SELECT id FROM a INNER JOIN b LIMIT 10
我在两个数据库上都有完全相同的表、索引和数据,所以我真的不知道为什么这么慢。
任何见解将不胜感激。
谢谢
编辑
这是我为什么需要这样做的一个具体示例。我需要得到最大值的总和。为了做到这一点,我需要一个子选择,如下面的查询所示。
SELECT SUM(a) AS a
FROM (
SELECT table2.b, MAX(table1.a) AS a
FROM table1
INNER JOIN table2 ON table2.abc_id = table1.abc_id
AND table1.read_datetime >= table2.issuance_datetime
AND table1.read_datetime < COALESCE(table2.unassignment_datetime, DATE('9999-01-01'))
WHERE table1.read_datetime BETWEEN '2012-01-01 10:30:01' AND '2013-07-18 03:03:42' AND table2.c = 0
GROUP BY table2.id, b
) AS first
GROUP BY b
LIMIT 10
同样,这个查询在 MySQL 上需要 14 秒,在 Postgres 上需要 238 毫秒。这是 MySQL 上解释的输出:
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,PRIMARY,<derived2>,ALL,\N,\N,\N,\N,25584,Using temporary; Using filesort
2,DERIVED,table2,index,PRIMARY,index_table2_on_b,index_table2_on_d,index_table2_on_issuance_datetime,index_table2_on_unassignment_datetime,index_table2_on_e,PRIMARY,4,\N,25584,Using where
2,DERIVED,tz,ref,index_table1_on_d,index_table1_on_read_datetime,index_table1_on_d_and_read_datetime,index_table1_on_4,4,db.table2.dosimeter_id,1,Using where