mysql - 如何加快这个缓慢的查询?

标签 mysql

我遇到了一些问题,这个查询似乎太慢了......

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 

更新

您还应该查看 parallelizationpartitioning

通常与分区相关的其他好处包括以下列表中的那些。这些功能目前尚未在 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/

相关文章:

mysql - 没有 super 权限无法创建简单的 MySQL 函数

php - 如何删除选定的用户?磷酸二氢钾

mysql - 一对多 MongoDB 与 SQL

mysql - MCF : Can't provision mysql service

php - 在获取对象上定义新变量 - mysql

php - 拉维尔 : UPDATE if exist else INSERT?

mysql - 如何更改我的子选择,我可以使用 WHERE IN 获取多行?

mysql - 使用jsp多用户同时登录

mysql - 如何定位和显示我的 .Net 页面的特定数据库字段

mysql - 有没有办法在基于变量的比较中选择不同的列?