2012-03-02 38 views
1

我有表:的MySQL不使用索引

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; 

当我跑: EXPLAIN SELECT ID FROM TxtDila USE INDEX(基准)ORDER BY基准

我得到:

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

即使当我尝试 EXPLAIN从TxtDila使用索引(基准)使用索引(基准)ORDER BY基准 我可以看到filesort。

表有200.000条记录,约700MB。我有全文索引。

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

回答

2

您正在尝试阅读200,000条记录的ID字段(整个表格)。 Datum索引不包含ID字段,因此无论采用哪种方式,都需要从光盘读取ID字段。你告诉MySQL使用Datum上的索引来排序记录,然后阅读它们。这非常意味着从光盘上读取多达200,000次读取。 MySQL决定(正确),它只是在一次大的读取中从表中读取所有(ID, datum)对,并在内存中对它们进行排序。

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

+0

您需要多列索引,因为建议,因为MyISAM不会像InnoDB那样自动在索引中包含主键。 – 2012-03-02 15:48:44

+0

@马库斯,谢谢你的指针。我在硬盘访问策略方面并不是特别专业,所以寻求/读取/等等会让我略微感受一下。同意如果表是InnoDB那就不会有问题了。 – Hammerite 2012-03-02 15:49:14

0

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

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

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