1

我一直在寻找,但还没有看到令人满意的解决方案。所以有人可以帮忙..

我有一个简单的表,其中包含一个需要很长时间的简单查询。我使用的是 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 相同。

谁能告诉我为什么这需要这么长时间?让我知道我是否可以提供更多信息。

4

0 回答 0