MySQL-mysql查询关联表优化查询

发布于 2017-01-20 09:09:44 字数 279 浏览 1209 评论 2

有2个关系表,如下:

a表
a_id type name
1 1 测试1
2 1 测试2
3 2 测试3
4 2 测试4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2017-10-09 21:08:54

毫无疑问,是第一种方案

可以使用trigger来实现同步

虽然会造成部分的数据冗余,但是是拿空间换时间

性能和可伸缩性都比第二种要好。

另外,以你现在的数据规模,每一种type的数据行为1w+左右,

如果不发生数量级上的变化。

我估计你的两种方案,再加上第三种方案:

直接两个表,进行两次查询,取得数据后到应用端判断

结果差不了太多

清晨说ぺ晚安 2017-07-18 03:20:50

方案1:
首先,加的这个字段应该叫 has_status_2; 然后,如果再有需求 特殊处理status=3,怎么办; 这样在主表上加入 特殊需求的冗余,不好看也不好维护。

如果一定是针对这个特殊需求特殊处理,我觉得可以另建一个 冗余表 type_2_status_2, 里面只有一个字段 a_id, 冗余“type为2 并且 在b表中含有status为2 的 a表记录中”的a的id。加入触发器在改变a表和b表的时候触发。查询的时候直接 join a表。

或者考虑更通用的情况,建 冗余表 type_status(a_id, type,status).

方案2:
在a表(type,a_id), b表(status,a_id)上建索引。
用你的数据:

 select * from a
left join b on a.a_id = b.a_id and status = 2
where a.type = 2 and b.b_id is not null
ordey by a_id desc
limit 10;

走索引。

写成:

 select a.* from
(select a.a_id from a where a.type=2 and exists
(select 1 from b where a.a_id=b.a_id and status=2)
order by a.a_id desc limit 10
) T,
a where a.a_id=T.a_id;

子查询走覆盖索引。

不过 具体问题具体分析,还是得在你的数据环境里试一下 索引的效果。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文