在我正在开发的一个网络应用程序中,有一个UPDATE
正在减慢/阻止其他几个查询:
UPDATE products
SET visible = 1
WHERE merchant_id = in_merchant_id
AND source_code IN (
SELECT source_code
FROM feeds_processing_data
WHERE processing_id = in_processing_id
)
Run Code Online (Sandbox Code Playgroud)
它基本上更新了桌子上的特定“窗口” products
,根据其他一些信息打开或关闭可见性。该表是 Web 应用程序的核心,来自前端的搜索在其中运行(通过全文或通过代码查找),后台进程会不时更新其内容。
我通常通过检查查询计划并验证是否存在正确的索引来解决这些问题。
然而,令我困惑的是,列出的会话information_schema.PROCESSLIST
显示上述查询位于该preparing
状态,而其他被阻止的查询是Waiting for table flush
,我对此知之甚少或一无所知。
这是被阻止的查询之一:
SELECT id,
[...]
FROM (
SELECT (MATCH(NAME, description, manufacturer_name) AGAINST('+crema +mani' IN BOOLEAN MODE)) AS rank,
p.*
FROM products p
WHERE visible = 1
AND MATCH(NAME, description, manufacturer_name) AGAINST('+crema +mani' IN BOOLEAN MODE) LIMIT 400
) ranked …
Run Code Online (Sandbox Code Playgroud)