MySQL没有使用索引

时间:2012-03-02 14:58:39

标签: mysql indexing filesort

我有桌子:

CREATE TABLE IF NOT EXISTS `TxtDila` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
...
  `Datum` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
...
  PRIMARY KEY (`ID`),
  KEY `Datum` (`Datum`),
...
  FULLTEXT KEY `Titulek` (`Titulek`,`Anotace`,`Txt`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

我跑的时候: 从TxtDila USE INDEX(Datum)ORDER BY Datum

中的EXPLAIN SELECT ID

我明白了:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  TxtDila ALL NULL    NULL    NULL    NULL    214603  Using filesort

即使我尝试 来自TxtDila的EXPLAIN SELECT ID使用索引(Datum)USE INDEX(Datum)ORDER BY Datum 我可以看到filesort。

表有200,000条记录,大约700MB。我有全文索引。

任何人都可以帮助我吗? 谢谢

3 个答案:

答案 0 :(得分:2)

您正在尝试读取200,000条记录的ID字段(整个表格)。索引Datum不包含ID字段,因此无论您采用哪种方式,都将涉及从光盘读取ID字段。您告诉MySQL使用Datum上的索引对记录进行排序,然后读取它们。这几乎意味着从光盘中读取多达200,000个读取。 MySQL决定(正确地)在一次大读取中从表中读取所有(ID, datum)对并在内存中排序它们的工作量较少。

我建议将Datum索引设为(Datum, ID)上的多列索引。

答案 1 :(得分:1)

当您的查询中有WHERE子句时,通常会使用索引。另一种方法是使用SELECT... FORCE INDEX语法。您可以在此处阅读:http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

答案 2 :(得分:0)

全文索引实际上并不是普通查询中使用的索引...仅用于全文搜索(因此名称)。

此外,在这种情况下,您将获得filesort,因为您正在排序。

您不在id上使用主键索引,因为您不以任何方式限制查询 - 此查询将始终返回整个表。