1

このクエリのさまざまなバリエーションを試しましたが、タイムスタンプ インデックスを使用することができません。私は何を間違っていますか?

どんな助けでも大歓迎です:)


MariaDB [alienvault]> explain extended SELECT * FROM alienvault_siem.acid_event WHERE (timestamp BETWEEN '2012-10-09 11:20:17' AND '2012-10-10 03:20:17');
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id   | select_type | table      | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|    1 | SIMPLE      | acid_event | ALL  | timestamp     | NULL | NULL    | NULL | 4481579 |    50.00 | Using where |
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

テーブル構造:

CREATE TABLE IF NOT EXISTS `acid_event` (
  (...)
  `timestamp` datetime NOT NULL,
  (...)
  PRIMARY KEY (`id`),
  (...)
  KEY `timestamp` (`timestamp`),
  (...)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ソフトウェア: Percona サーバー

ソフトウェア バージョン: 5.5.27-28.1 - Percona Server (GPL)、リリース 28.1

4

2 に答える 2

3

考えられる原因: - インデックスが十分に選択的ではなく、mysql がフル スキャンの方が高速であると判断している - mysql のインデックス統計が不適切である

「SHOW INDEX FROM Alienvault_siem.acid_event;」の出力を確認できます。インデックスの使用を強制することもできます (ただし、フルスキャンの方が高速な場合は、うまくいかない可能性があります)。

SELECT * FROM alienvault_siem.acid_event FORCE INDEX (`timestamp`) WHERE (timestamp BETWEEN '2012-10-09 11:20:17' AND '2012-10-10 03:20:17');
于 2012-10-17T18:43:26.370 に答える
1

問題は、日付リテラルを文字列として提供したことです。

str_to_date()関数を次のように使用する場合

WHERE timestamp 
  BETWEEN str_to_date('2012-10-09 11:20:17','%Y-%m-%d %H:%i:%s') 
      AND str_to_date('2012-10-10 03:20:17','%Y-%m-%d %H:%i:%s') 

その後、MySQL はインデックスを使用できるようになります。

于 2012-10-10T05:00:59.140 に答える