在第 159 页的高性能 MySQL 中,他们谈到将复杂的查询分解为简单的查询:
转换
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag='mysql';
Run Code Online (Sandbox Code Playgroud)
到
SELECT * FROM tag WHERE tag='mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);
Run Code Online (Sandbox Code Playgroud)
并在您的应用程序中实际加入自己。
我的问题是,当最终查询有一个 where 子句需要匹配几千个 ID 时,这是否仍然是一个好主意(实际表本身有大约 50 万个条目)。
我的意思是,像这样的查询会受到很大的惩罚吗
SELECT * FROM post WHERE post.id in (123,456,567, ... <a few thousand IDs here> ... ,9098,8904);
Run Code Online (Sandbox Code Playgroud)
而不是上面的join语句?将此逻辑移动到数据库内的存储过程是否有帮助(同时考虑到 MySQL 中实现的存储过程有多糟糕)?