某天,有条语句通过正常思维去思考理论上是没问题的,但内部机制导致基本是全表查询:
SELECT id,source,source_id,type,op_name,op_by
FROM operation_logs
WHERE id in (
SELECT MAX(id) as id from operation_logs
WHERE source=’app_materials’
AND source_id in (103525)
AND type=2
GROUP by source_id
)
性能分析:
一群程序员一起研究如何优化这条sql语句,研究了好一会儿,试了几种方案都失败了,直到某个程序员将该语句扔到chatGPT:
测试了一下,效果极好:
问了chatGPT这样优化的原因,回答:
使用IN子句时,MySQL需要对子查询中的每个值执行一次完整的表扫描,这可能会导致性能
问题。在此特定查询中,子查询将返回一个具有多个源D的单个D,因此MySQL需要执行多
次表扫描。此外,如果operation_logs表很大,那么子查询可能会占用大量时问和资源。
要改进此查询,您可以将子查询改为连接,以避免使用IN子句。
学习了!
chatGPT不算是一个传统意义上的智能交互机器人了。
chatGPT已经是人类智慧的宝库,人们可以快速方便地从宝库中查找已存在的智慧。
至少,下次遇到不好优化的sql语句,可以试试往chatGPT里扔(笑)