所以我有3个表,db,db2,db3。我需要db中的所有行,还需要db2和db3中的总数。我想在一个查询中执行此操作并且下面的查询有效..
SELECT *, (SELECT COUNT(*) FROM db2) AS total2, (SELECT COUNT(*) FROM db3) AS total3
FROM db
我想知道的是,因为那些嵌套的SQL查询出现在每一行中,它们会运行那么多次吗?或者mysql是否优化使得它运行一次,使其成为常量,并将其添加到每一行? 重要的是要知道db变得非常大;
非常感谢对此文档的答案和参考。
答案 0 :(得分:2)
我不确定mysql是否在您的问题中缓存或优化子查询,但您可以使用交叉连接重写查询以确保计数查询仅运行一次
select * from db
cross join (select count(*) as total2 from db2) t1
cross join (select count(*) as totla3 from db3) t2
击> <击> 撞击>
<强>更新强>
我检查了查询计划,mysql已经优化了原始查询,因为它识别出它不是依赖子查询。请注意select_type
为SUBQUERY
,只运行一次,而不是DEPENDENT SUBQUERY
,每行运行一次(参见Difference between Subquery and Correlated Subquery)
<强>子查询强>
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
| 1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 106 | NULL |
| 2 | SUBQUERY | t1 | index | NULL | id | 4 | NULL | 38511 | Using index |
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
交叉加入
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | NULL |
| 1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 106 | NULL |
| 2 | DERIVED | t3 | index | NULL | id | 4 | NULL | 38511 | Using index |
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
答案 1 :(得分:0)
基本上你需要做的是将join
db2和db3导入db。要做到这一点,你应该首先从db2和db3中选择你需要的东西(如果不需要,我不会选择所有内容,它只会使查询更长/更慢)。然后将db2连接到db3,将db3连接到db,并提供所需的所有信息。
Select
db2.total_number,
db3.total_number,
db.*
From
db2
Inner Join
db3 On db2.some_equal_key = db3.some_equal_key
Inner Join
db On db3.some_equal_key = db.some_equal_key
请注意,连接表至少需要一个相同的值(例如相同的主键)。这将用于join
语句 - 在我的示例中为some_equal_key