php - MySQL全文索引查询不使用任何索引?

标签 php mysql full-text-indexing

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

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;

当我执行全文搜索时,100 万行用了 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  |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+

这是预期的吗?我怎样才能加快速度?

最佳答案

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

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

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

关于php - MySQL全文索引查询不使用任何索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48680340/

相关文章:

php - 为什么在以下场景中无法访问资源 ID?

mysql - XAMPP 在 Windows 7 启动时自动启动

MySQL FULLTEXT 查询问题

mysql - 我无法在包含大量文本的 Django 模型字段上使用索引。我正在使用MySQL。我应该怎么办?

PHP CreateFromFromFormat() 仅限月份和年份

PHP foreach 循环将每 2 个项目包裹成一行

php - 可以:hover apply to generic element tags specific to a parent div?

php - 在 foreach 中格式化 MySQL 日期

mysql - Rails 中的产品、类别和品牌数据库关系

full-text-search - apache cassandra 查询/全文搜索