日期:2014-05-17  浏览次数:20473 次

msyql查询优化
现在有个很棘手的问题,小弟是新手,对mysql不是很熟悉
目前是这个样子
有10个表  
表名为demo_0,demo_1....demo_9,
这十个表的结构完全相同,但每个表都有200多万行,
我需要将这十个表union 为一个临时表,然后再跟另一个test表的字段关联

小弟写的sql如下:
select * from (select * from demo_0 union all 
select * from demo_1 union all 
select * from demo_2 union all 
select * from demo_3 union all 
select * from demo_4 union all 
select * from demo_5 union all 
select * from demo_6 union all 
select * from demo_7 union all 
select * from demo_8 union all
select * from demo_9  
) as demo
left join test on test.id = demo.c_id 
where .....

结果是直接跑不动,请各位大侠指点

------解决方案--------------------
这十个表union压力会很大。就这段语句的话,基本上是没有优化的可能了。

你尝试把left join test on test.id = demo.c_id where ..... 这个条件放入到内部去看看。
比如:

select * from (select * from demo_0 union all
select * from demo_1 
left join test on test.id = demo.c_id
where .....

union all

select * from demo_2 
left join test on test.id = demo.c_id
where .....
...
) as demo

最好把整个数据操作流程贴出来,这样能更好的优化。
------解决方案--------------------
你的UNION all语句中,尽可能不要不加入筛选条件,这样几乎就是2000万数据了,因为10各表每次全表扫描首先就存在某些问题,是否真的需要这样做?如果不是,一定要改。如果是,那恐怕要改表结构了。比如说,10各表直接合在一起,用某些字段来区分
------解决方案--------------------
对2000万的表加索引然后查询会比你这样合起来查询更快,因为我也不确定你这样UNION出来的结果集再join的时候是否能用到索引
------解决方案--------------------
如果有条件筛选,那就要先尽早筛选然后再汇总,不然数据量那么大,什么DBMS都受不了的。
------解决方案--------------------
一运行就要从2000万数据中查找,压力太大。

我的想法是:来个循环,第一个表没有数据,再去找第二个表。
如果找到了就退出循环,那样3到10的表就不用去查找了。

不过你这个查询,找到了数据还要去遍历所有的十个表?