MySQL/MariaDB 优化两个 Table 全文搜索

MySQL/MariaDB Optimizing a Two Table Full Text Search

我正在尝试弄清楚如何优化全文搜索查询,这对于两个 table 来说似乎相当慢,每个都有大约 2k 个条目。我是 运行 MariaDB 10.3.x。两个 table 查询比针对单个 table 执行的查询慢几个数量级(例如 0.255 秒对 0.03 秒)。

目标是在相关 uninet_articles 字段(bodyabstracttitlesubtitle)中搜索字词,并查看如果 uninet_tags table 中出现了该术语,请酌情加入。 table 都有全文索引。这是查询:

    SELECT a.approve
    ,a.aid
    ,a.sid
    ,a.articleFormat
    ,title
    ,cachedTitle
    ,subtitle
    ,body
    ,abstract
    ,a.linkUrl
    ,a.byline
    ,a.poster
    ,a.allowComments
    ,a.allowRatings
    ,a.gmt
    ,a.lastModified
    ,a.modifier
    ,a.type
    ,UNIX_TIMESTAMP(a.gmt) AS DATETIME
    ,a.commentCount
    ,a.ratingCount
    ,a.ratingDetails
    ,(MATCH(a.body, a.title, a.subtitle, a.abstract) AGAINST('OS X' IN NATURAL LANGUAGE MODE) + MATCH(tags.name) AGAINST('OS X' IN NATURAL LANGUAGE MODE)) AS relevanceScore
    ,a.readCount
FROM uninet_articles a
LEFT JOIN uninet_tags AS tags ON a.aid = tags.paid
    AND MATCH(tags.name) AGAINST('OS X' IN NATURAL LANGUAGE MODE)
WHERE MATCH(a.body, a.title, a.subtitle, a.abstract) AGAINST('OS X' IN NATURAL LANGUAGE MODE)
    OR tags.tid
    AND a.type = 'article'
    AND `approve` != '0'
ORDER BY `approve` DESC
    ,`gmt` DESC LIMIT 0
    ,10

升级到当前版本的 MariaDB 后,我的查询时间减少了 25%。我试过 MyISAM 和 InnoDB——InnoDB 的性能似乎比 MyISAM 差 50%。 Aria 似乎比 MyISAM 快一点,但并不明显。

这引出了两个问题:首先,有没有一种方法可以优化查询以使其更快,这样当我在 table 中扩展数据时,它是半接受的table?其次,有没有一种方法可以优化 InnoDB 的查询,这样我就可以继续迈向更安全的数据库系统?

多次 FT 测试

MATCH 喜欢成为 第一。但是另一个MATCH不能也是“第一”。

OR 也会严重影响性能。

所以,让我们把它们分开:

SELECT ...
    WHERE MATCH(tags.name) AGAINST('OS X' IN NATURAL LANGUAGE MODE)
UNION DISTINCT
SELECT ...
    WHERE MATCH(a. ...) AGAINST('OS X' IN NATURAL LANGUAGE MODE)
UNION DISTINCT
SELECT ...
    WHERE tags.tid

然后将其用作 'derived' table 来完成剩下的工作:

SELECT ...
    FROM ( the-above-union ) AS u
    ....

“字”的定义

此外,space 不会FULLTEXT 搜索中的“词”内工作。

其他问题

嗯... tags.tid 是布尔值吗?也许您需要针对某些东西进行测试?