2013-02-18 5 views
2

У меня есть таблица для аудита. Я использовал этот запрос для того, чтобы не получить пользователей, которые в настоящее время вошли в систему. Но этот запрос занимает очень много времени в последние пару дней. При анализе из журнала медленных запросов количество проверенных строк слишком велико.Как количество проверенных строк больше числа строк в таблице?

Всего строк на столе в этот день является 6032194 (

select count(*) from audit where audit.created_time 
    between UNIX_TIMESTAMP(CURRENT_DATE() - INTERVAL 3 DAY) * 1000 
    AND UNIX_TIMESTAMP(CURRENT_DATE()-INTERVAL 2 day) * 1000 

).

Запрос

select count(user_id) from audit where audit.created_time 
between UNIX_TIMESTAMP(CURRENT_DATE() - INTERVAL 3 DAY) * 1000 AND 
UNIX_TIMESTAMP(CURRENT_DATE()-INTERVAL 2 day) * 1000 
and operation in ('s','g','y','fb'); 

Объяснить Выходной

  id: 1 
    select_type: SIMPLE 
     table: audit 
     type: range 
possible_keys: IAMAccountAudit_CTndx 
      key: IAMAccountAudit_CTndx 
     key_len: 9 
      ref: NULL 
     rows: 16434866 
     Extra: Using where 

Это выполнение в запросе диапазона. Но он исследует строки 86158436.

Slow журнал запросов:

# Time: 130216 1:09:21 
# [email protected]: root[root] @ [bharathik] 
# Query_time: 1853.751416 Lock_time: 0.000101 Rows_sent: 1 Rows_examined: 86158436 
SET timestamp=1361005761; 
    SELECT UNIX_TIMESTAMP(CURRENT_DATE() - INTERVAL 1 DAY) * 1000, 'SIGNIN', 0, count(distinct(zuid)) as SIGN_IN_COUNT from audit where audit.CREATED_TIME BETWEEN 
UNIX_TIMESTAMP(CURRENT_DATE() - INTERVAL 3 DAY) * 1000 AND 
UNIX_TIMESTAMP(CURRENT_DATE()-INTERVAL 2 day) * 1000 

Создание таблицы

+-----------------------+--------------+------+-----+---------+-------+ 
| Field     | Type   | Null | Key | Default | Extra | 
+-----------------------+--------------+------+-----+---------+-------+ 
| auto_id    | bigint(19) | NO | PRI | 0  |  | 
| user_id    | varchar(100) | YES | MUL | NULL |  | 
| service    | varchar(100) | YES |  | NULL |  | 
| name     | varchar(100) | YES |  | NULL |  | 
| operation    | varchar(15) | YES |  | NULL |  | 
| ipaddress    | varchar(50) | YES |  | NULL |  | 
| referrer    | varchar(250) | YES |  | NULL |  | 
| user_agent   | varchar(250) | YES |  | NULL |  | 
| created_time   | bigint(19) | YES | MUL | NULL |  | 
+-----------------------+--------------+------+-----+---------+-------+ 
+0

Чтобы уточнить, ключ IAMAccountAudit_CTndx является индексом поля created_time, правильно? Кроме того, вы говорите, что ищете количество пользователей, которые в настоящее время вошли в систему, но ваш запрос, как представляется, подсчитывает общее количество строк за период дня, который соответствует «операции в (« s »,« g », y ',' fb ') " –

+0

Возможно, было бы полезно опубликовать таблицу create и инструкцию insert для генерации выборочных данных, чтобы попробовать запрос. (Очевидно, что не вся ваша таблица, а несколько строк, чтобы мы могли видеть структуру и попробовать запросы по фактическим данным.) –

+0

Вы представляете три разных утверждения и спрашиваете, почему вы получаете различное количество строк, проверенных/возвращенных? – rabudde

ответ

0

С 2-го запроса SQL имеет положение IN, нуждается в дополнительных 'строк', чтобы оценить. Эти дополнительные «строки» представляют временные результаты из предложения IN.

Смежные вопросы