我有桌子:
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。我有全文索引。
任何人都可以帮助我吗? 谢谢
答案 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上使用主键索引,因为您不以任何方式限制查询 - 此查询将始终返回整个表。