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
# 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    |       |
+-----------------------+--------------+------+-----+---------+-------+
4

1 に答える 1

0

2 番目の SQL クエリには IN 句があるため、追加の「行」を評価する必要があります。これらの追加の「行」は、IN 句からの一時的な結果を表します。

于 2013-02-24T21:55:07.073 に答える