【问题标题】:MySQL not using indexMySQL不使用索引
【发布时间】:2012-03-02 14:58:38
【问题描述】:

我有桌子:

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 ( Datum ) ORDER BY Datum

我明白了:

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 SELECT ID FROM TxtDila use index(Datum) USE INDEX ( Datum ) ORDER BY Datum 我可以看到文件排序。

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

谁能帮帮我? 谢谢

【问题讨论】:

    标签: mysql indexing filesort


    【解决方案1】:

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

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

    【讨论】:

    • 按照建议,您需要多列索引,因为 MyISAM 不会像 InnoDB 那样自动在索引中包含主键。
    • @Marcus,感谢您的指点。我在硬盘访问策略方面不是特别专家,所以寻找/读取/等让我略过了。同意如果该表是 InnoDB 则不会有问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      此外,在这种情况下,您会得到文件排序,因为您正在排序。

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

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 2013-04-07
        • 2013-07-10
        • 2012-12-31
        • 2013-12-07
        相关资源
        最近更新 更多