gpt4 book ai didi

php - MySQL - 全文搜索 - 丢失索引

转载 作者:行者123 更新时间:2023-11-30 01:37:25 27 4
gpt4 key购买 nike

所以这是场景:

  • MySQL
  • 有 1 个 MYISAM 表
  • 名为 v.value 的列具有全文索引

基本查询工作正常,按预期使用索引:

SELECT p.online_identifier
FROM (...)
WHERE r.area_id = 3 AND s.state_id= 4
AND (snap.area_has_catalogues_attributes_id = 7028
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))
<小时/>

现在,当我添加 OR 时,不使用全文搜索索引(在 v.value 上)。我运行解释来验证它。

查询看起来像这样:


(...)
其中 r.area_id = 3 且 s.state_id= 4 且
(snap.area_has_catalogues_attributes_id = 7028 AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))
OR (snap.area_has_catalogues_attributes_id = 7045 AND MATCH (v.value) AGAINST('+OtherBrand' IN BOOLEAN MODE))

<小时/>

我不明白为什么。有什么想法吗?

最佳答案

这里有一些有趣的事情:您的查询实际上导致全文索引被忽略。别担心,这不是你的错。我之前写过这个:Is there a way to hint to query optimizer to MySQL which constraints should be done first?

查看我的答案及其后续链接后,现在让我们看看您的原始查询:

SELECT p.online_identifier
FROM (...)
WHERE r.area_id = 3 AND s.state_id= 4
AND (snap.area_has_catalogues_attributes_id = 7028
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))

您必须单独执行全文搜索并仅检索 ID。

使用这些 ID 连接到其他表别名。

<小时/>

让我接受 my other links 之一的查询演示如何处理您的查询

代替这个查询

select * from seeds WHERE MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE) = 4;

你必须将其重构为如下所示:

SELECT B.* FROM
(
SELECT id,MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE) score
FROM seeds
WHERE MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE)
) A
INNER JOIN seeds B USING (id)
WHERE A.score = 4;

尝试一下!!!

关于php - MySQL - 全文搜索 - 丢失索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16675734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com