mysql “SHOW PROCESSLIST”显示执行中的查询,但在运行“SHOW ENGINE INNODB STATUS”时无法找到

tp5buhyn  于 2023-05-05  发布在  Mysql
关注(0)|答案(1)|浏览(194)

一个内部的C++数据挖掘算法输出CSV文件,并使用并行的“LOAD DATA”命令将其加载到一个新的MySQL数据库中。
在导入之后,将对新插入的表执行多个“post-script”,以便为前端使用做好准备。
但是,这些查询的性能可能差异很大。一次正常的执行大约是3秒,但是每执行5-6次,它将花费无限的时间(天)。
具有讽刺意味的是,当它执行时,我可以复制/粘贴慢速查询并在控制台内运行它,以在+- 3秒内获得结果。而初始查询继续挂起。

INSERT INTO `rule`
SELECT SQL_NO_CACHE *
FROM cp
         JOIN cll ON (
            cp.context_id = cll.context_id
        AND cp.direct_lowers_list_id = cll.concept_list_id
    )
         JOIN cc ON (
            cc.context_id = cll.context_id
        AND cc.concept_id = cll.target_id
        AND cc.concept_support > GREATEST(?, ? * cp.concept_support)
    )
         JOIN gl ON (
            gl.context_id = ?
        AND gl.context_id = cp.context_id
        AND gl.concept_id = cp.concept_id
    )
WHERE cp.context_id = ?;

当发生这种情况时,查询是:

  • 在“SHOW ENGINE INNODB STATUS”的事务部分中未看到
  • 观察到非常慢的撤销日志速率(上升1/秒,而正常情况下为10000 +/秒)。

Percona Server 8.0.32-24,在使用MySql 8时也注意到了同样的事情。显示EXPLAIN时查询已完全索引。我的.cnf设置是默认的,我最初尝试增加innodb_buffer_pool_size,这使得查询无限慢的可能性更大。
有什么建议我应该检查什么?我花了两个星期来解决这个问题。任何帮助都非常感谢。

iklwldmw

iklwldmw1#

这是不必要的。

gl.context_id = ?

因为这些

gl.context_id = cp.context_id
cp.context = ?

全索引”通常表示单列索引。综合指数可能更好。这些索引可能有助于:

cp:  INDEX(context_id)
cll:  INDEX(context_id,  concept_list_id, target_id)
cc:  INDEX(context_id,  concept_id, concept_support)
gl:  INDEX(context_id,  concept_id)

添加复合索引时,DROP具有相同前导列的索引。当你有了INDEX(a)和INDEX(a,b)两个值时,就扔掉前者。

变更

AND  cc.concept_support > GREATEST(?, ? * cp.concept_support)

AND  cc.concept_support > ?
AND  cc.concept_support > ? * cp.concept_support)

这可能会给予索引更好的使用机会。
出示SHOW CREATE TABLEEXPLAIN SELECT ...

相关问题