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的表就不用去查找了。
不过你这个查询,找到了数据还要去遍历所有的十个表?