首页 / 帖子
MySQL中应该多表连接查询一次取数据库还是多次查询取数据?

MySQL中应该多表连接查询一次取数据库还是多次查询取数据?具体的case在下面。

三个表的字段如下:

webcast_cast表:id,organizerId,title,startDate,endDate,number,date等

webcast_organizer表:id,organizerName,organizerLogo等

webcast_theme表:id,castId,themeName,speakerName,popularity等


三个表之间的关系是:

webcast_cast表与webcast_organizer表之间是一对一的关系。

webcast_cast表与webcast_theme表之间是一对多的关系。


需求是:

取出webcast_cast的前10条数据(按照date时间倒序排序),同时能够关联的拿出webcast_organizer表和webcast_theme表中的相关数据。


目前我的SQL语句如下:

1.先拿出前10条webcast_cast和webcast_organizer表关联的数据。

SELECT 'a.id','a.title','a.startDate','a.endDate','a.number','a.date','b.organizerName','b.organizerLogo'WHERE a.organizersId=b.id ORDER a.date DESC LIMIT 0,10


2.对上面拿出的数据做foreach循环,然后分别拿出每条webcast_cast数据所对应的webcast_theme数据【可能存在多条】。


问题就在这里:10条webcast_cast数据相当于要执行10次SQL的读取操作【感觉这样非常不好】。


我的想法是:能不能采用多表连接的方式用一条SQL语句就能够实现了????


请教高手。谢谢。


4个答案
Amanda Song
发布于:2014-07-19 09:42

一次查询应该能实现,甚至写个存储过程都可以。

不过问题的关键是,不建议用复杂的SQL一次查询取数据,而应该多次查询。

数据库查询中,有一个简单的原则:不要连表查询。

虽然说,这个原则可能有些绝对,但是一般情况下,都是推荐多次查询去数据的。连表查询其实是偷懒不负责任的做法,把很多逻辑运算抛给数据库,这样数据库的压力会很大,而一般应用最大的瓶颈会在数据库,所以最好把这种业务计算放到代码逻辑实现,甚至加上缓存处理。

针对你这个问题,我觉得还是多次去数据,10次20次不是大问题,中间加上缓存,效果会好很多。

闻涛
发布于:2014-07-20 10:18

如果是我,可能会这么做:

  1. 第一条SQL,只取出需要的webcast_cast的10条记录

  2. 在php程序里,在第1步结果中各自取出10个webcast_organizer和webcast_theme的id

  3. 第二条SQL,用这10个id一次取出相应的webcast_organizer的记录

  4. 第三条SQL,用这10个id一次取出相应的webcast_theme的记录

  5. 用这10个id,在php程序里,将第1、3、4步得到的结果集整理出需要的最终结果


这样做,我觉得有几个好处:

  1. 保持实体(假设3张表对应3种实体类型)的独立存取、封装。如果以后想提高性能改用其它数据存储方式的话,对它的引用不会被影响。每种实体类型只对外提供一个查询的方法(例如,获取参数array里所有id的记录,类似node_load_multiple)

  2. 减少对同一个表的多次SQL查询。作为参数,一次传入多个id,在where里面用in,即可将10次查询减少为1次

  3. 3个结果集取出后,还可根据需要进行cache,方便之后的使用而无需再次查询数据库

发布于:2014-07-21 15:22

木辉说的有道理,当循环里存在查询的时候,要注意优化。


1,当数据量不大的时候,可以将取出的ID以IN的形式一次性的把相关数据取出来,而不是放到循环里去取,这一点和木辉说的是一个意思。


2,当ID数据量很大时,你用IN语句本身也会变成慢查询,这时可以试试临时表。

发布于:2014-07-22 10:54

先取出基本表再用基本表的主键值作为IN条件查关联表. 一般主键值数量不大 (多少算大 你按照项目来评估); 数据量大 那你的业务逻辑就有问题了, 你看别人的分页数据 一般10个以下为一页.