2014-12-11 3 views
0

У меня есть база данных с 187840 строками. Когда я выполнить этот запрос у меня есть это сообщение выполнения запроса была прерванаСлишком тяжелое выполнение запроса

СЛИШКОМ ВЫСОКАЯ QUERY

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; 

Что такое е решение?

+0

Почему вы хотите получать такие большие данные? –

+1

Каков ожидаемый результат? – kamoor

+0

Решение состоит в том, чтобы запросить меньше данных ... – Flosculus

ответ

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). Это устраняет внешнее агрегирование (вместо этого агрегирование использует индекс) и позволяет использовать индекс для сопоставления.

+0

да ее лучше, чем мой запрос, если я ограничу дни, но у меня есть 356 дней:/ – jarSec

+0

Я не понимаю ваш комментарий. Если вы хотите определенный диапазон дней, просто используйте предложение 'where' во внешнем запросе. –

+0

Я использую этот запрос для отображения диаграммы масштабирования, и я использую таблицу дней, потому что у меня отсутствует диапазон дат в связанной таблице. – jarSec

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; 
     } 
Смежные вопросы