mysql - 让我的 SQL 查询更有效率

标签 mysql sql optimization

我的数据库中有数百万个条目。

因为我用的是 3!!内部联接并放置大范围的日期此查询需要很长时间,最多几分钟。

有没有办法改进这个查询并仍然获得相同的数据?

这是我的查询:

SELECT 
    subscriptions.service_id, 
    service_send_type.usage, 
    service_send_type.price, SUM(IF(msg_t.status LIKE 'Success%', 1, 0)) AS s, 
    COUNT(1) AS t 
FROM (`subscriptions`) 
    INNER JOIN 
        `msg_t` ON `subscriptions`.`phone` = `msg_t`.`phone` AND subscriptions.id = msg_t.sub_id 
    INNER JOIN
        `msg` ON `msg`.`id` = `msg_t`.`msg_id` 
    INNER JOIN `service_send_type` ON `msg`.`service_id` = `service_send_type`.`service_id` 
        AND msg.sushi_service_id = service_send_type.sushi_service_id 
        AND msg.send_type = service_send_type.name 
        AND msg.service_id = subscriptions.service_id 

    WHERE 
        `subscriptions`.`service_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) 
        AND 
        `subscriptions`.`added` >= '2013-01-28 00:00:00' 
        AND 
        `subscriptions`.`added` <= '2013-01-28 23:59:59' 
        AND 
        `msg_t`.`send_time` >= '2013-01-28 00:00:00' 
        AND 
        `msg_t`.`send_time` <= '2013-01-28 23:59:59' 

    GROUP BY 
        `subscriptions`.`service_id`, 
        `service_send_type`.`usage`, 
        `service_send_type`.`price`

最佳答案

您是否总是需要 IN询问?在您的查询中,IN 子句可以替换为 subscriptions.service_id < 17这将产生巨大的影响。当您有一个离散值列表时,IN 查询是合适的。

还要查看表上的索引。您应该在 where 中的列上设置索引条件和 group by条款。

关于mysql - 让我的 SQL 查询更有效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599898/

相关文章:

mysql 在删除前获取字段值

sql - 设计支持多语言的数据库

php - 检查字符串中的空格

c++ - 为什么将指针作为 (char *) 传递并强制转换为 (long *)

PHP 和 MySQL : PHP filtering query from database over a list

mysql - 执行更新时出错

java - 对于序列中的每个成员,确定它是否是完全平方数

返回 NULL 的 PHP MySQL 查询

python - 快速查找输入中位数的方法

java - 现代 JVM 是否优化了简单的内联匿名类分配?