2013-02-18 19 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'); 

explain输出

  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')“ – 2013-02-20 06:24:36

+0

发布创建表和插入语句以生成一些示例数据以尝试查询可能会有帮助。 (显然不是你的整个表,而是几行,所以我们可以看到结构并尝试对实际数据进行查询。) – 2013-02-20 06:26:07

+0

你提出了三种不同的陈述,并问你为什么得到不同数量的行被检查/返回? – rabudde 2013-02-20 07:18:07

回答

0

由于第二SQL查询IN子句,额外的 '行' 需要进行评估。这些额外的'行'表示IN子句的临时结果。

相关问题