テーブルには80万以上の行があります。私は時間間隔で行を抽出するクエリのパフォーマンスを改善する必要があります。MySQLはタイムスタンプカラムで自分のインデックスを無視します
私のテーブル:私はこのクエリを書くとき
EXPLAIN SELECT * FROM bets WHERE
bets.stamp_end BETWEEN '2016-05-01 00:00:00' AND '2016-06-01 00:00:00';
+----+-------------+-------+-------+----------------------+----------------------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+----------------------+----------------------+---------+------+--------+-------------+
| 1 | SIMPLE | bets | **range** | bets_stamp_end_index | bets_stamp_end_index | 5 | NULL | **158210** | Using where |
+----+-------------+-------+-------+----------------------+----------------------+---------+------+--------+-------------+
、インデックスが使用されることはありません:
EXPLAIN SELECT * FROM bets WHERE
stamp_end >= DATE_SUB(DATE(NOW()), INTERVAL 56 DAY);
+----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------+
| 1 | SIMPLE | bets | **ALL** | bets_stamp_end_index | NULL | NULL | NULL | **857651** | Using where; Using filesort |
+----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------+
注たまにインデックスは、このクエリで使用されて
CREATE TABLE `bets` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
...
`stamp_end` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `bets_stamp_end_index` (`stamp_end`)
) ENGINE=InnoDB AUTO_INCREMENT=875534 DEFAULT CHARSET=utf8;
: 私はすでにOPTIMIZE TABLEを実行しています。最初のクエリでは、インデックスは一部の日付間隔でのみ使用されます。
なぜインデックスが使用されないのですか?どんな解決策ですか?インデックスを使用して
stamp_end> = CURDATE() '試してみてください - INTERVAL 56 DAY' –
ちょうど試してみました:完全なテーブルと同じ問題をインデックスを使用せずにスキャンしてください。 –
'SELECT * FROM bets FORCE INDEX(bets_stamp_end_index)WHERE stamp_end> = CURDATE() - INTERVAL 56 DAY' –