MySQL:子查询还是联合?
我不解释查询的逻辑,因为它并不简单。如果我详细解释的话,没有人愿意阅读和深入探究这个问题的本质 有两个查询。他们工作做得很好。结果:相同。在手动模式下检查,在纸上和数据库上使用铅笔 哪个查询将减少服务器的负载?还是只有在实际生产服务器上工作一段时间后才能发现 操作UNION很难加载服务器?我应该在querys的解释中寻找什么 1 q带++MySQL:子查询还是联合?,mysql,subquery,union,Mysql,Subquery,Union,我不解释查询的逻辑,因为它并不简单。如果我详细解释的话,没有人愿意阅读和深入探究这个问题的本质 有两个查询。他们工作做得很好。结果:相同。在手动模式下检查,在纸上和数据库上使用铅笔 哪个查询将减少服务器的负载?还是只有在实际生产服务器上工作一段时间后才能发现 操作UNION很难加载服务器?我应该在querys的解释中寻找什么 1 q带++ select (select count(comid) from coms join posts on pid=pid_coms where uid_pos
select (select count(comid) from coms join posts on pid=pid_coms where uid_posts=8888 and uid_coms=8888)
+
(select count(comid) from frends join posts on sl_frend=uid_posts join coms on pid=pid_coms
where uid_coms=8888 and m_frend=8888 and ((postacc=1 and postcomacc=2) or (postacc=2 and postcomacc=2) or (postacc=2 and postcomacc=1)))
+
(select count(comid) from frends join posts on m_frend=uid_posts join coms on pid=pid_coms
where uid_coms=8888 and sl_frend=8888 and ((postacc=1 and postcomacc=2) or (postacc=2 and postcomacc=2) or (postacc=2 and postcomacc=1)))
+
(select count(comid) from coms join posts on pid_coms=pid where uid_posts != 8888 and uid_coms=8888 and postacc=1 and postcomacc=1) CountMyComms;
EXPLAIN
+----+-------------+--------+--------+-----------------------+----------+---------+---------------------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+--------+-----------------------+----------+---------+---------------------+------+----------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
| 5 | SUBQUERY | coms | ref | uid_coms,pid_coms | uid_coms | 4 | const | 7 | |
| 5 | SUBQUERY | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 4 | SUBQUERY | frends | ref | m_frend,sl_frend | sl_frend | 4 | const | 1 | |
| 4 | SUBQUERY | coms | ref | uid_coms,pid_coms | uid_coms | 4 | const | 7 | |
| 4 | SUBQUERY | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 3 | SUBQUERY | coms | ref | uid_coms,pid_coms | uid_coms | 4 | const | 7 | |
| 3 | SUBQUERY | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 3 | SUBQUERY | frends | ref | m_frend,sl_frend | sl_frend | 4 | mbs.posts.uid_posts | 1 | Using where |
| 2 | SUBQUERY | coms | ref | uid_coms,pid_coms | uid_coms | 4 | const | 7 | |
| 2 | SUBQUERY | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
+----+-------------+--------+--------+-----------------------+----------+---------+---------------------+------+----------------+
11 rows in set (0.00 sec)
2问:工会在哪里
select count(comid) from (select comid from coms join posts on pid=pid_coms where uid_posts=8888 and uid_coms=8888
union
select comid from frends join posts on sl_frend=uid_posts join coms on pid=pid_coms
where uid_coms=8888 and m_frend=8888 and ((postacc=1 and postcomacc=2) or (postacc=2 and postcomacc=2) or (postacc=2 and postcomacc=1))
union
select comid from frends join posts on m_frend=uid_posts join coms on pid=pid_coms
where uid_coms=8888 and sl_frend=8888 and ((postacc=1 and postcomacc=2) or (postacc=2 and postcomacc=2) or (postacc=2 and postcomacc=1))
union
select comid from coms join posts on pid_coms=pid
where uid_posts != 8888 and uid_coms=8888 and postacc=1 and postcomacc=1) a;
EXPLAIN
+----+--------------+----------------+--------+-----------------------+----------+---------+---------------------+------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+----------------+--------+-----------------------+----------+---------+---------------------+------+------------------------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
| 2 | DERIVED | coms | ref | uid_coms,pid_coms | uid_coms | 4 | | 7 | |
| 2 | DERIVED | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 3 | UNION | coms | ref | uid_coms,pid_coms | uid_coms | 4 | | 7 | |
| 3 | UNION | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 3 | UNION | frends | ref | m_frend,sl_frend | sl_frend | 4 | mbs.posts.uid_posts | 1 | Using where |
| 4 | UNION | frends | ref | m_frend,sl_frend | sl_frend | 4 | | 1 | |
| 4 | UNION | coms | ref | uid_coms,pid_coms | uid_coms | 4 | | 7 | |
| 4 | UNION | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| 5 | UNION | coms | ref | uid_coms,pid_coms | uid_coms | 4 | | 7 | |
| 5 | UNION | posts | eq_ref | PRIMARY,pid,uid_posts | PRIMARY | 4 | mbs.coms.pid_coms | 1 | Using where |
| NULL | UNION RESULT | <union2,3,4,5> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+----------------+--------+-----------------------+----------+---------+---------------------+------+------------------------------+
12 rows in set (0.00 sec)
看起来您正在查找表的一系列不同查询的记录计数之和 第一种选择。。。计算每个查询的结果,然后添加它们。。。会更快。为什么?它有更少的工作要做。您的第二个备选方案必须对一组comid值进行争论,然后对它们进行计数。这需要时间 如果可以,请使用COUNT*。更便宜。尽可能使用UNION ALL而不是UNION;UNION删除重复项,而UNION ALL不删除。删除重复项需要时间 这两种方法的性能取决于每个子查询的索引选择。是否必须使用COUNTcomid?或者你能用COUNT*?也就是说,是否存在任何空comid值?计数*稍微快一点。在第二个查询中,联合的每个部分返回的comid值集是否不相交?如果是,请使用UNION ALL。同样,如果可以,请使用COUNT*。不可以为null,好的,我使用COUNT*duolicates不可能,索引存在。任何变量:union、+++、countcomid、count*queryS的运行时间都小于0.08秒。测试了大约70000-100000条记录,一切正常。将来我需要监视生产服务器。