n0n*_*g0n 6 php mysql join while-loop
在我上班的公司,他们运行PHP/MySQL关系数据库.我一直认为,如果我需要从不同的表中提取不同的信息,我可以做一个简单的连接来提取数据,如....
SELECT table_1.id, table_2.id FROM table_1 LEFT JOIN table_2 ON table_1.sub_id = table_2.id
Run Code Online (Sandbox Code Playgroud)
当我到达目前工作的地方时,这就是他们所做的.
<?php $query = mysql_query("SELECT sub_id FROM table_1");
while($rs = mysql_fetch_assoc($query)) {
$query_2 = mysql_fetch_assoc(mysql_query("SELECT * FROM table_2 WHERE id = '{$rs['sub_id']}'"));
//blah blah blah more queries
?>
Run Code Online (Sandbox Code Playgroud)
当我问为什么这是第二种方式时,他们说它实际上比连接运行得更快.他们管理一个数据库,该数据库在不同的表上有数百万条记录,而且有些表格有点宽(按行方式).他们说,如果执行不当的查询可能会锁定一个表(或其中几个),他们想避免连接.另外要记住的是,有一个大型报表生成器附加到此数据库,客户端可以使用它来构建自己的报表,如果它们发疯并构建一个大型报表,则可能会造成一些严重破坏.
我很困惑,所以我想我会把它扔到那里为一般的编程公众.这可能是一个观点问题,但是执行while语句真的更快(一个更大的查询来拉大量行,然后是很多小的子查询,如果你愿意)或者做一个连接(拉一次更大的查询,以获得您需要的所有数据).只要索引正确完成,重要吗?另一件需要考虑的事情是当前的数据库是InnoDB格式.
谢谢!
2014年8月28日更新
所以我想我会对这个更新,以及更长远的工作.在讨论之后,我决定在这里重建报告生成器.我没有明确的结果数字,但我想我会分享结果.
我觉得有点矫枉过正,因为我将整个报告(就返回的数据而言非常有活力)变成了一个大规模的连接节目.大多数连接(如果不是全部)都将一个值加入主键,因此它们都运行得非常快.如果报告允许说出30列数据并且它提取了2000条记录,则每个字段都在运行查询以获取数据(因为该数据可能位于不同的字段上).30 x 2000 = 60000甚至在每个查询的甜蜜查询时间0.0003秒之间,这仍然只是查询时间的18秒(这几乎就是我记得它).现在我将查询重建为一堆主键上的大量连接(如果可能),同样的报告在大约2-3秒内加载,大部分时间都是下载html.每个返回的记录在0-4个额外查询之间运行,具体取决于所需的数据(如果可以在连接中获取它,则可能不需要任何数据,这种情况发生在75%的时间).因此,相同的2000条记录将返回额外的0-8000个查询(远远好于60000).
我会说while语句在某些情况下很有用,但正如下面评论中所述,基准测试就是它的全部内容.在我的例子中,连接是更好的选择,但在我的网站的其他区域,while语句更有用.在一个实例中,我有一个报告,其中客户端可以请求多个类别,并仅返回这些类别的数据.发生了什么事情,我有一个category_id IN(...,...,..,.., etc etc etc)50-500的ID,索引会扼杀我的怀抱,因为我在最后时刻拿着它.所以我所做的就是在10组展开的ID,并运行相同的查询X/10次,我的结果是取的方式,因为指数喜欢处理10点的ID,而不是500比以前快了,所以我就看见一个很大的进步我的查询然后因为做了while语句.
如果正确使用索引,那么使用 JOIN几乎总是更有效。之所以强调这一点,是因为最佳效率并不总是等于最佳性能。
但实际上并没有一个放之四海而皆准的答案。您应该使用来分析查询,EXPLAIN以确保索引确实正在使用,没有不必要的临时表使用等。在某些情况下,条件会共同创建一个不能使用索引的查询。在这些情况下,按照您指定的方式将查询分成几部分可能会更快。
如果我在现有项目中遇到这样的代码,我会质疑它:检查查询,考虑执行查询的不同方法,确保已考虑这些事情,建立支持或反对实践的科学的、有事实支持的案例。确保原始开发人员尽职尽责,因为不使用 JOIN 表面上表明数据库或查询设计不佳。但最终,结果很明显,如果所有优化和更正仍然导致比使用查询片段提供的连接速度慢,那么更快的解决方案将占上风。制定基准并根据基准的结果采取行动;在软件设计中,你不应该用糟糕的性能来换取遵守关于你应该做什么或不应该做什么的武断规则。效果最好的方法就是最好的方法。