现在有三个表,A只有8条记录,B和C各有二十多万条记录我要从这三个表中进行多表查询。起初,我将A/B/C通过inner join的方式,建立了视图,然后在视图上进行查询。但性能却强差人意,执行一次平均需要三五分钟,而且经常会由于无响应导致查询失败。目前,我个人愚见觉得join的方式有点不对,因为是笛卡尔乘积而且视图不支持索引,所以要遍历所有数据,也就是8*20W*20W次,想想都可怕。不过我想不到其他的办法,请各位朋友给点意见,指导一下可以吗?
如果哪里描述不祥,请提出来,我会持续增加信息。
如果哪里描述不祥,请提出来,我会持续增加信息。
解决方案 »
- 为什么用distinct去重后,还会有重复记录
- Incorrect string value: '\xAD\xBF The...' for column '
- 不显示删除回复显示所有回复显示星级回复显示得分回复 请教一条错误的SQL语句,另外如果查询条件只能用like,like能否用大于小于来确定范围?
- 将A表某个字段拷贝到B表的一个字段怎么写?
- 求oracle语句转换mysql!~
- mysql 通配符 % 的问题
- 自定义函数
- 我的mysql开不了服务???
- got error
- MySQL多主键,其中一个主键使用AUTO_INCREMENT自增,结果报错!!
- 一个数据库存取
- 求sql语句,主表与子表
视图语句:
a表8条记录,b、c各20万条记录CREATE VIEW viewName AS selcet 需要的字段名 from ((`a` join `b` on((`a`.`code` = `b`.`code`))) join `c` on((`a`.`policyno` = `c`.`policyno`)))视图建立后,在视图上进行查询,语句大致如下:
select 需要的字段名 from viewName where 条件1=? and 条件2 in(1,2,3) and 条件3=?对于a,b,c这三个表,都是以id作为主键(即id无任何意义,只作为流水号)。好像作为了主键是有主键索引的吧?
selcet 需要的字段名
from (`a` join `b` on `a`.`code` = `b`.`code`)
join `c` on `a`.`policyno` = `c`.`policyno`
where 条件1=? and 条件2 in(1,2,3) and 条件3=?先创建以下索引
b (code)
c (policyno)另外需要针对你的 条件1=? and 条件2 in(1,2,3) and 条件3=?进行分析。
重新根据应用设计表吧。如果实在没办法,考虑把a内容冗余如b,或者c,简化关联关系。
a b c
a c b
b/c a c/b要么就不会出问题,
既然你出了问题,这个问题就不是简单的索引能解决的原则是越向右侧关联的结果集越小。 而你这个应用,显然不符合这个原则。再建索引也没啥意义。
这样单独执行快么?select 需要的字段名
from (selcet 需要的字段名
from ((`a` join `b` on((`a`.`code` = `b`.`code`))) join `c` on((`a`.`policyno` = `c`.`policyno`)))
)k
where 条件1=? and 条件2 in(1,2,3) and 条件3=?这样在code和policyno上加索引试试
show warnings;
select 需要的字段名
from (selcet 需要的字段名
from ((`a` join `b` on((`a`.`code` = `b`.`code`))) join `c` on((`a`.`policyno` = `c`.`policyno`)))
)k
where 条件1=? and 条件2 in(1,2,3) and 条件3=?这样执行快么
慢的话 试试code和policyno上加索引试试
不行啊,还是非常慢
现在总结一下哈:
使用视图(或嵌套视图的sql语句)就会很慢,大概需要五六分钟,甚至有时候会失败。
但如果直接操作要三四分钟,快了几分钟。
假如A join B ON(a.code=b.code)的话,在A中建立索引跟没建立速度还是一样,但在B中不建立的话需要三四分钟,建立后只要五六秒。速度越来越快,差距越来越大。
现在就极度迷惑:
1.视图不是被数据库优化了吗?应该会快很多的啊,但为什么却极度缓慢?
2.为什么在B中建立索引会快那么多,而在其他地方建却没什么作用?(A中二十多万条记录,B中接近一百多条,不是说在记录数少的表中不适宜建索引的吗?)
20W
1
20W
这样的结果。楼主,提问题,不发关键性的东西,谁能帮上你。
上面几位都告诉你看下分析结果,愣是不贴,还问个屁