MyISAM 性能:加入分解

Dex*_*ter 7 mysql myisam performance

在第 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 中实现的存储过程有多糟糕)?

小智 2

我已经在几个地方这样做了。在应用程序逻辑中执行多个简单查询并构建 ID 列表,即使 ID 列表包含 10,000 多个 ID,也能显着提高性能。我正在查询的表有大约 500 万条记录,并且执行 JOIN 的速度非常慢。切换到使用带有 ID 列表的 IN 后,大约花费了 JOIN 所用时间的 1%。