MySQL-mysql查询关联表优化查询
有2个关系表,如下:
a表
a_id type name
1 1 测试1
2 1 测试2
3 2 测试3
4 2 测试4
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有2个关系表,如下:
a表
a_id type name
1 1 测试1
2 1 测试2
3 2 测试3
4 2 测试4
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
毫无疑问,是第一种方案
可以使用trigger来实现同步
虽然会造成部分的数据冗余,但是是拿空间换时间
性能和可伸缩性都比第二种要好。
另外,以你现在的数据规模,每一种type的数据行为1w+左右,
如果不发生数量级上的变化。
我估计你的两种方案,再加上第三种方案:
直接两个表,进行两次查询,取得数据后到应用端判断
结果差不了太多
方案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;
子查询走覆盖索引。
不过 具体问题具体分析,还是得在你的数据环境里试一下 索引的效果。