2013-02-18 2 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 행을 검사합니다.

느린 쿼리 로그 :

# 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 table 및 insert 문을 게시하는 것이 도움이 될 수 있습니다. (분명히 전체 테이블은 아니지만 몇 줄이 있으므로 구조를보고 실제 데이터에 대한 쿼리를 시도 할 수 있습니다.) –

+0

세 가지 다른 문을 제시하고 왜 검사/반환 된 행 수가 다른지 묻습니다. – rabudde

답변

0

2 SQL 쿼리 이후는 IN 절은 추가 '행'의 필요성을 평가해야한다. 이러한 추가 '행'은 IN 절의 임시 결과를 나타냅니다.