ruby-on-rails - 这条mysql查询是否还有优化的余地?
阿神
阿神 2017-04-17 12:01:27
[MySQL讨论组]
Post.includes(:user).where('sticky = true OR id in (select post_id from `feeds` where user_id = ? )',current_user.id).page(params[:page]).per(15)

意即

SELECT COUNT(*) FROM `posts` WHERE `posts`.`trashed` = 0 AND (sticky = true OR id in (select post_id from `feeds` where user_id = 1 ))
阿神
阿神

闭关修行中......

全部回复(3)
PHP中文网

优化的第一步是得分析,使用EXPLAIN

OR一般都可以使用UNION来优化,如果子查询select post_id fromfeedswhere user_id = 1的结果会很大就不推荐使用IN,用JOIN可能会更好。

高洛峰

@Mr_Jing 说的都很对,接着他的说,最好不用子查询,变成where条件,转换不成where的话转换成join, 如果一行的数据比较大不推荐count(*) 最好count(主键),尤其是数据库引擎为InnoDB的时候。再次强调要用EXPLAIN来分析

ringa_lee
 id in (select post_id from `feeds` where user_id = 1 )

不清楚feeds有多大,但第一眼看到你说优化的话,可能目标就是in,数据多的话你要尽量的避免去in。
可以考虑冗余字段,用join等等办法……

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号