私はずっと探していましたが、満足のいく解決策を見たことはありません。だから誰かが助けることができます..
時間がかかる単純なクエリを含む単純なテーブルがあります。バージョン5.5.32-0ubuntu0.13.04.1を使用しています(実際にはLinux Mint Oliviaです。また、MariaDBに切り替えましたが、違いはないようです。)
デモ用にテスト テーブルを作成しました。
mysql> テーブル作成テストを表示します。
| test | CREATE TABLE `test` (
`sym` char(5) COLLATE utf8_bin DEFAULT NULL,
`date` date DEFAULT NULL,
`vol` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
次に、別のテーブルから 1,100 万行を入力しました。「sym」に単純なインデックスを追加すると
'SELECT * FROM test WHERE Sym='ORCL';
ショー
セットで 6467 行 (0.10 秒)
次に、日付にインデックスを追加すると、次のような場合に時間がかかります。
SELECT * FROM test WHERE Date='2008-10-1';
セットで 2488 行 (12.40 秒)
これは疑わしいことにインデックスのない時間に近く、クエリの実行中はハード ドライブのライトが点灯しています。
USE INDEX や FORCE INDEX も試しましたが、効果がないようです。
BTW SELECT COUNT(*) FROM test WHERE Date='2008-10-1';
戻り値
+----------+
| COUNT(*) |
+----------+
| 2488 |
+----------+
1 row in set (0.02 sec)
そして、日付フィールドだけを要求すると、
SELECT date from test where date=20081020;
約 0.30 秒で正しい行数が返されるため、そのためにインデックスを使用しています。
EXPLAIN SELECT * FROM test WHERE Date='2008-10-1';
ショー (日付インデックスを「dt」と呼びました)
+------+-------------+---------------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+-------+------+-------+
| 1 | SIMPLE | test | ref | dt | dt | 4 | const | 2445 | |
+------+-------------+-------+------+---------------+------+---------+-------+------+-------+
Extra 列が空白になっていることに注意してください。USE INDEX と FORCE INDEX も同様です。
なぜこれがそんなに時間がかかるのか誰か教えてもらえますか? もっと情報を提供できるかどうか教えてください。