我一直在寻找,但还没有看到令人满意的解决方案。所以有人可以帮忙..
我有一个简单的表,其中包含一个需要很长时间的简单查询。我使用的是 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 |
然后我用另一个表中的 1100 万行填充它。如果我在 '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 相同。
谁能告诉我为什么这需要这么长时间?让我知道我是否可以提供更多信息。