我需要一个建议,如何做得更好。
我有两张桌子'shop'和'office'。它们都有列'ad_id'但不相互交叉。我需要得到商店广告和办公室广告的总和。
如何做得更好:
只要我知道我无法通过左连接或类似方式加入他们,因为他们没有交叉数据,所以我只能这样做:
SELECT count(*) + (SELECT count(*) FROM shop) FROM office
如何做得更好?有没有办法做得更好,如果没有 - 哪一个应该更快?
答案 0 :(得分:2)
如何做得更好? 让数据库做好数学运算
有没有办法做得更好或者如果没有 - 哪一个应该更快? 通常,在通过网络传输不必要的数据或呼叫之前,在数据库中进行基于集合的处理是最佳的。
这样简单应该有用......(在mySQL中)
SELECT (select sum(amt) from shop) + (select sum(amt) from office)
工作示例:SQL FIDDLE
它将使用shop_ads和office ads列从办公室和商店返回所有记录的总和,将结果一起添加并返回1个数字。
答案 1 :(得分:1)
进行速度测试:
create table a2
(
r int not null
);
DELIMITER $$
CREATE procedure jamInRandom ()
BEGIN
declare iCount int;
set iCount=1;
WHILE iCount<=100 DO
insert a2(r) values (rand()*424+1);
set iCount=iCount+1;
END WHILE;
set iCount=1;
WHILE iCount<=6 DO
insert into a2(r) select r from a2;
set iCount=iCount+1;
END WHILE;
END $$
DELIMITER ;
call jamInRandom(); -- call stored proc
select count(*) from a2; -- 6400 rows (100 random)
select count(*) as theCount,sum(r),avg(r),min(r),max(r) from a2;
+----------+---------+----------+--------+--------+
| theCount | sum(r) | avg(r) | min(r) | max(r) |
+----------+---------+----------+--------+--------+
| 6400 | 1279360 | 199.9000 | 6 | 424 |
+----------+---------+----------+--------+--------+
1 row in set (0.01 sec)
现在尝试在php循环中设置秒表
-- clean up:
-- drop procedure jamInRandom;
-- drop table a2;
将最后一次循环从6改为10,然后我得到:
+----------+----------+----------+--------+--------+
| theCount | sum(r) | avg(r) | min(r) | max(r) |
+----------+----------+----------+--------+--------+
| 102400 | 21538816 | 210.3400 | 11 | 424 |
+----------+----------+----------+--------+--------+
1 row in set (0.07 sec)