【问题标题】:MySQL fulltext index query does not use any index?MySQL全文索引查询不使用任何索引?
【发布时间】:2018-02-08 07:57:40
【问题描述】:

我有一个这样创建的简单表

CREATE TABLE IF NOT EXISTS metadata (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    title varchar(500),
    category varchar(50),
    uuid varchar(20),
    FULLTEXT(title, category)
) ENGINE=InnoDB;

当我执行全文搜索时,1M 行需要 2.5 秒。所以我执行了一个查询计划器,它不使用任何索引:

mysql> explain SELECT uuid, title, category, MATCH(title, category) AGAINST ('grimm' IN NATURAL LANGUAGE MODE) AS score FROM metadata HAVING score > 0 limit 20;
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+
|  1 | SIMPLE      | metadata | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1036202 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+

这是预期的吗?如何加快速度?

【问题讨论】:

    标签: php mysql full-text-indexing


    【解决方案1】:

    您的查询获取表中的每一行,计算自然语言匹配,然后将结果(仍然是每一行)传递给 HAVING 子句。这是一个表扫描。

    您应该尝试将全文索引搜索放入 WHERE 子句中,以减少匹配行数。

    mysql> explain SELECT uuid, title, category FROM metadata 
        WHERE MATCH(title, category) AGAINST ('grimm' IN NATURAL LANGUAGE MODE) 
        LIMIT 20;
    

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2021-09-04
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多