查询执行太重

时间:2014-12-11 15:38:33

标签: php mysql

我有一个包含187840行的数据库。 当我执行此查询时,我有此消息查询执行被中断

太重要了

SELECT days.day,count(U.sig_name) as number 
FROM days 
LEFT JOIN linked U ON 
    days.day = date(timestamp) 
    AND 
    U.sig_name REGEXP  "^Tester" 
GROUP BY days.day;

解决方案是什么?

2 个答案:

答案 0 :(得分:0)

这是您的查询:

select days.day, count(U.sig_name) as number
from days left join
     linked U
     on days.day = date(timestamp) AND U.sig_name REGEXP "^Tester"
group by days.day;

由于timestamp周围的函数调用,您遇到了问题。你可能会发现这个版本更好:

select days.day,
       (select count(*)
        from linked u
        where u.timestamp >= days.day an du.timestamp < date_add(days.day, interval 1 day) and
              u.sig_name not like '%Tester%'
       )
from days;

对于性能,您需要linked(timestamp, sig_name)上的复合索引。这消除了外部聚合(聚合使用索引代替),并允许索引用于匹配。

答案 1 :(得分:0)

您可以使用LIMIT处理海量数据:

$limit_size = 10000;
        $flag_done = false;

        for ($i = 1; ! $flag_done; $i++) {
            $queryString = "SELECT days.day,count(U.sig_name) as number from days left join linked U on days.day = date(timestamp)  AND U.sig_name REGEXP  "^Tester" group by days.day LIMIT $index*$limit_size, $limit_size";

            if($result = mysql_query($queryString, $db)){
                [WHAT YOU WANT TO DO WITH RESULT HERE]
            } else $flag_done = true;
        }