我遇到了一些问题,这个查询似乎太慢了......
SELECT SUM(c) FROM (
(
SELECT COUNT( id ) AS c
FROM QueueOne
WHERE id = my_id
)
UNION ALL (
SELECT COUNT( id ) AS c
FROM QueueTwo
WHERE id = my_id
)
UNION ALL (
SELECT COUNT( id ) AS c
FROM QueueThree
WHERE id = my_id
)
UNION ALL (
SELECT COUNT( id ) AS c
FROM QueueFour
WHERE id = my_id
)
) AS d
其实很简单: 队列一、队列二、队列三、队列四 是具有不同类型列的四个队列,不幸的是不能压缩到一个列。
此查询为我们提供了每个队列表中所有等待队列的数量。 对于 mysql 来说似乎太慢了,因为它将它记录在 slow-query.log 文件中
如有任何帮助,我们将不胜感激。
编辑 这是解释:
+----+--------------+-------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+-------------------+------+---------------+------+---------+------+------+-------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 4 | |
| 2 | DERIVED | QueueOne | ref | ID | ID | 4 | | 1 | Using index |
| 3 | UNION | QueueTwo | ref | ID | ID | 4 | | 1 | Using index |
| 4 | UNION | QueueThree | ref | ID | ID | 4 | | 1 | Using index |
| 5 | UNION | QueueFour | ref | ID | ID | 4 | | 1 | Using index |
| NULL | UNION RESULT | <union2,3,4,5> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+-------------------+------+---------------+------+---------+------+------+-------------+
6 rows in set (0.82 sec)
编辑 2: 多一点信息,一些表有将近 15 000 000 条记录
最佳答案
在id
上添加索引,改写成count(*)
SELECT SUM(c)
FROM ((SELECT COUNT(*) AS c
FROM queueone
WHERE id = my_id)
UNION ALL
(SELECT COUNT(*) AS c
FROM queuetwo
WHERE id = my_id)
UNION ALL
(SELECT COUNT(*) AS c
FROM queuethree
WHERE id = my_id)
UNION ALL
(SELECT COUNT(*) AS c
FROM queuefour
WHERE id = my_id)) AS d
更新
您还应该查看 parallelization和 partitioning
通常与分区相关的其他好处包括以下列表中的那些。这些功能目前尚未在 MySQL 分区中实现,但在我们的优先级列表中名列前茅。
涉及 SUM() 和 COUNT() 等聚合函数的查询可以轻松并行化。此类查询的一个简单示例可能是 SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id
;。 “并行”是指查询可以在每个分区上同时运行,最终结果仅通过对所有分区获得的结果求和得到。
关于mysql - 如何加快这个缓慢的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5818699/