一个内部的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,这使得查询无限慢的可能性更大。
有什么建议我应该检查什么?我花了两个星期来解决这个问题。任何帮助都非常感谢。
1条答案
按热度按时间iklwldmw1#
这是不必要的。
因为这些
“全索引”通常表示单列索引。综合指数可能更好。这些索引可能有助于:
添加复合索引时,DROP具有相同前导列的索引。当你有了INDEX(a)和INDEX(a,b)两个值时,就扔掉前者。
变更
到
这可能会给予索引更好的使用机会。
请出示
SHOW CREATE TABLE
和EXPLAIN SELECT ...