gpt4 book ai didi

MySQL "OR MATCH"在多个表上挂起(非常慢)

转载 作者:行者123 更新时间:2023-11-29 01:47:33 25 4
gpt4 key购买 nike

在学习了如何进行 MySQL 全文搜索之后,针对多个表的推荐解决方案是 OR MATCH,然后进行其他数据库调用。您可以在我下面的查询中看到这一点。

当我这样做时,它只是陷入“忙碌”状态,我无法访问 MySQL 数据库。

SELECT 
a.`product_id`, a.`name`, a.`slug`, a.`description`, b.`list_price`, b.`price`, c.`image`, c.`swatch`, e.`name` AS industry,
MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE ) AS relevance
FROM
`products` AS a LEFT JOIN `website_products` AS b
ON (a.`product_id` = b.`product_id`)
LEFT JOIN ( SELECT `product_id`, `image`, `swatch` FROM `product_images` WHERE `sequence` = 0) AS c
ON (a.`product_id` = c.`product_id`)
LEFT JOIN `brands` AS d
ON (a.`brand_id` = d.`brand_id`)
INNER JOIN `industries` AS e ON (a.`industry_id` = e.`industry_id`)
WHERE
b.`website_id` = %d
AND b.`status` = %d
AND b.`active` = %d
AND MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE )
OR MATCH ( d.`name` ) AGAINST ( '%s' IN BOOLEAN MODE )
GROUP BY a.`product_id`
ORDER BY relevance DESC
LIMIT 0, 9

如有任何帮助,我们将不胜感激。


编辑

涉及到的表都是MyISAM,utf8_general_ci。

这是 EXPLAIN SELECT 语句:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ALL NULL NULL NULL NULL 16076 Using temporary; Using filesort
1 PRIMARY b ref product_id product_id 4 database.a.product_id 2
1 PRIMARY e eq_ref PRIMARY PRIMARY 4 database.a.industry_id 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 23261
1 PRIMARY d eq_ref PRIMARY PRIMARY 4 database.a.brand_id 1 Using where
2 DERIVED product_images ALL NULL NULL NULL NULL 25933 Using where

我不知道如何使它看起来更整洁——对此感到抱歉


更新

它在 196 秒后返回查询(我认为是正确的)。没有多个表的查询大约需要 0.56 秒(我知道这真的很慢,我们计划很快改用 solr 或 sphinx),但是 196 秒??

如果我们可以在品牌名称 ( d.name ) 中为相关性添加一个数字,那也行得通

最佳答案

我发现有 2 个问题大大减慢了我的查询速度并修复了它们。

要回答第一个问题,需要在整个“MATCH AGAINST OR MATCH AGAINST”周围加上括号:

WHERE 
b.`website_id` = %d
AND b.`status` = %d
AND b.`active` = %d
AND (
MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE )
OR MATCH ( d.`name` ) AGAINST ( '%s' IN BOOLEAN MODE )
)

我不明白如何使用EXPLAIN SELECT,但它帮了我不少忙,谢谢!这将第一个数字 16076 行减少到 143。然后我注意到另外两个有超过 23 和 25000 行。这是这一行的原因:

LEFT JOIN ( SELECT `product_id`, `image`, `swatch` FROM `product_images` WHERE `sequence` = 0) AS c 
ON (a.`product_id` = c.`product_id`)

我最初这样做是有原因的,后来改变了。当我更改它时,我没有意识到我可以进行正常的 LEFT JOIN:

LEFT JOIN `product_images` AS c 
ON (a.`product_id` = c.`product_id`)

这使我的最终查询变成这样:(而且从 196 秒到 0.0084 秒左右快得多)

SELECT 
a.`product_id`, a.`name`, a.`slug`, a.`description`, b.`list_price`, b.`price`,
c.`image`, c.`swatch`, e.`name` AS industry,
MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE ) AS relevance
FROM
`products` AS a LEFT JOIN `website_products` AS b
ON (a.`product_id` = b.`product_id`)
LEFT JOIN `product_images` AS c
ON (a.`product_id` = c.`product_id`)
LEFT JOIN `brands` AS d
ON (a.`brand_id` = d.`brand_id`)
INNER JOIN `industries` AS e
ON (a.`industry_id` = e.`industry_id`)
WHERE
b.`website_id` = %d
AND b.`status` = %d
AND b.`active` = %d
AND c.`sequence` = %d
AND (
MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE )
OR MATCH( d.`name` ) AGAINST( '%s' IN BOOLEAN MODE )
)
GROUP BY a.`product_id`
ORDER BY relevance DESC
LIMIT 0, 9

哦,甚至在我对多个表进行全文搜索之前,它也需要大约 1/2 秒。这是很大的改进。

关于MySQL "OR MATCH"在多个表上挂起(非常慢),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2891037/

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