sql大神帮忙解答下,小白求助,只有100分,全给了

xsx1271 2016-11-01 08:49:20

表间关系如图,我的sql查询时间太长了
SELECT t.*,c.*,d.*,p.*,s.*,m.* FROM TESTDATABEAN t,CARDBEAN c,DEVICEBEAN d ,PERSONBEAN p, SAMPLEBEAN s, MANAGERBEAN m WHERE t.CID=c.ID AND d.ID=t.DID  
AND p.ID=t.TESTER_ID AND s.ID=t.SAMPLE_ID AND m.ACCOUNT=t.MANAGERACCOUNT LIMIT 1000000,50

受影响的行: 0
时间: 54.197s
这还是没有添加筛选条件,索引都是建好的
请大神指点下,不然我就得把这些表都合成一个表了,试过这种速度很快130w开始查50个1秒都不到。但是字段太多,而且不利于扩展,还是想分表
感激不尽
...全文
104 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-11-01
  • 打赏
  • 举报
回复
都是*号,看看从业务上是否真的需要所有字段。 另外,LIMIT 1000000,50这种取100w开始的50条,没办法快,如果是100,50 你试试快吗?
致命的西瓜 2016-11-01
  • 打赏
  • 举报
回复
引用 4 楼 xsx1271 的回复:
inner join 是不是根where一样得啊,过滤条件可能会有,也可能不会有,那是不是说这种多表的联合查询速度快不了?那怎么办呢,合并成一个表?
join ON 和where 并不冲突,只是join 可以指定关联字段,减少产生笛卡尔积的 可能性,并能很好地 适用索引,where条件仍然可加,建议你先把sql改掉之后查看执行计划,还有,查询的字段尽量少用星号,
xsx1271 2016-11-01
  • 打赏
  • 举报
回复
引用 3 楼 zhangsheng_1992 的回复:
上面的sql写的有点问题 修正下
select * from a inner join (select * from b where id = 1) as b on a.id = b.id
inner join 是不是根where一样得啊,过滤条件可能会有,也可能不会有,那是不是说这种多表的联合查询速度快不了?那怎么办呢,合并成一个表?
zhangsheng_1992 2016-11-01
  • 打赏
  • 举报
回复
上面的sql写的有点问题 修正下
select * from a inner join (select * from b where id = 1) as b on a.id = b.id
zhangsheng_1992 2016-11-01
  • 打赏
  • 举报
回复
楼上说的没问题 补充一下 首先 关于笛卡尔积 你可以理解成一条临时记录 假设2张表 a,b 各有两条数据 join连接的时候 产生的笛卡尔积 是2*2=4然后再根据条件过滤 大于2并不完全等于4 我这只是举个例子 关于笛卡尔积比较难说清楚 建议自己百度文库下 再看你的表 t.*,c.*,d.*,p.*,s.*,m.* 你自己粗略算假设你每张表1000条 产生的笛卡尔积有多少?如何避免呢? 1.可以拆分成多个表连接 最后合并 2.如果无法避免连表 那么应该使用子查询尽量减少笛卡尔积的数量 举例 比如
select * from a inner join b on a.id = b.id where b.id=1
假设a,b都有10条 那么产生的笛卡尔积在粗略算下 10*10 再过滤 a表的10条 * b表的10条 使用子查询
select * from a inner join (select * from b where id = 1) on a.id = b.id
首先 假设select * from b where id = 1过滤过b表以后剩下5条 那么粗略算笛卡尔积为 a表的10条*b表过滤后的5条再过滤 当下减少了不少 第二 关于select t.*,c.*,d.*,p.*,s.*,m.*这样的查询方法本身就有问题 *代表所有字段 而这所有字段并非是你能全部用到的 只查询自己所需的字段是个好习惯 第三

explain SELECT t.*,c.*,d.*,p.*,s.*,m.* FROM TESTDATABEAN t,CARDBEAN c,DEVICEBEAN d ,PERSONBEAN p, SAMPLEBEAN s, MANAGERBEAN m WHERE t.CID=c.ID AND d.ID=t.DID  
AND p.ID=t.TESTER_ID AND s.ID=t.SAMPLE_ID AND m.ACCOUNT=t.MANAGERACCOUNT LIMIT 1000000,50
执行下 看看你的索引情况
致命的西瓜 2016-11-01
  • 打赏
  • 举报
回复
用left join或者join用on关联,这种join 后面跟where的会产生大量笛卡尔积
xsx1271 2016-11-01
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
都是*号,看看从业务上是否真的需要所有字段。 另外,LIMIT 1000000,50这种取100w开始的50条,没办法快,如果是100,50 你试试快吗?
感谢版主指点,打算把表合起来搞 列表得时候不需要*号,这时候打算先查需要显示得字段,具体得选中后再查一条数据得*号,这样就会好些 这个验证码真是难啊,都看不清楚
xsx1271 2016-11-01
  • 打赏
  • 举报
回复
引用 5 楼 wangjian0228 的回复:
[quote=引用 4 楼 xsx1271 的回复:] inner join 是不是根where一样得啊,过滤条件可能会有,也可能不会有,那是不是说这种多表的联合查询速度快不了?那怎么办呢,合并成一个表?
join ON 和where 并不冲突,只是join 可以指定关联字段,减少产生笛卡尔积的 可能性,并能很好地 适用索引,where条件仍然可加,建议你先把sql改掉之后查看执行计划,还有,查询的字段尽量少用星号,[/quote] 试了下,确实只查询指定字段会快很多,打算把表合起来搞

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧