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 | |
+-----------------------+--------------+------+-----+---------+-------+
只是澄清一下,关键IAMAccountAudit_CTndx是created_time字段上的索引,是否正确?此外,你说你正在寻找当前登录的用户数量,但是你的查询似乎是在一天中的行数与“('s','g',' y','fb')“ – 2013-02-20 06:24:36
发布创建表和插入语句以生成一些示例数据以尝试查询可能会有帮助。 (显然不是你的整个表,而是几行,所以我们可以看到结构并尝试对实际数据进行查询。) – 2013-02-20 06:26:07
你提出了三种不同的陈述,并问你为什么得到不同数量的行被检查/返回? – rabudde 2013-02-20 07:18:07