mysql - 检查的行数如何大于表中的行数?

标签 mysql

我有一个审计表。我使用此查询来获取当前登录的用户数量。但是,此查询在过去几天花费了很长时间。从慢速查询日志中分析,检查的行数太长。

当天表中的总行数是 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
# User@Host: 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    |       |
+-----------------------+--------------+------+-----+---------+-------+

最佳答案

由于第二个 SQL 查询有一个 IN 子句,因此需要评估额外的“行”。这些额外的“行”表示 IN 子句的临时结果。

关于mysql - 检查的行数如何大于表中的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934795/

相关文章:

php - 合并mysql中两个查询的结果

php - MySQL:如果值存在则对该行进行更新,如果值不存在则进行插入

php - php中如何获取url值

c# - 如何在asp.net中使用mysql连接远程数据库?

c++ - 使用 C++ 和 Visual Studio 的 Linux 应用程序

php - MySQL查询日期范围

sql - 如何在 MYSQL 中优化此查询?需要做什么

mysql - 从数据库表填充复选框并将其值插入到另一个表

mysql - 使用 MYSQL 反向排名

mysql - 带条件的 INSERT SELECT