首先,这个问题是关于MySQL 3.23.58的,所以请注意。
我有 2 个表,定义如下:
Table A: id INT (primary), customer_id INT, offlineid INT
Table B: id INT (primary), name VARCHAR(255)
现在,表 A 包含 65k+ 条记录,而表 B 包含约 40 条记录。除了2个主键索引外,A表的offlineid字段上还有一个索引,每个表的字段比较多,但不相关(我看是这样的,请问是不是必要的)对于这个查询。
我首先收到以下查询(查询时间:~22 秒):
SELECT b.name, COUNT(*) AS orders, COUNT(DISTINCT(a.kundeid)) AS leads
FROM katalogbestilling_katalog a, medie b
WHERE a.offlineid = b.id
GROUP BY b.name
现在,medie 中的每个 id 都与不同的名称相关联,这意味着您可以按 id 和名称进行分组。一些来回测试使我确定了这一点(查询时间:~6 秒):
SELECT a.name, COUNT(*) AS orders, COUNT(DISTINCT(b.kundeid)) AS leads
FROM medie a
INNER JOIN katalogbestilling_katalog b ON a.id = b.offline
GROUP BY b.offline;
有什么方法可以将它调低到“即时”时间(最坏情况下最多 1 秒)?我在 offlineid 上添加了索引,但除此之外以及查询的重新安排,我不知道该做什么。 EXPLAIN 查询显示查询正在使用 fileshort(原始查询也使用临时表)。欢迎所有建议!
最佳答案
我猜你的主要问题是你使用的是这么旧版本的 MySQL。也许 MySQL 3 不喜欢 COUNT(DISTINCT())。
或者,它可能只是系统性能。你有多少内存?
不过,MySQL 3 确实很旧。我至少会组装一个测试系统,看看新版本是否能更快地运行该查询。
关于mysql - 优化大型表上的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/114284/