如何解决优化sql join查询,比较查询效果
| 我是一名学生,负责我学院的Moody CMS(课程管理系统)模块。我必须为我的模块编写一些联接查询。我无法更改表结构,它们几乎是一成不变的(我没有将它们赋予我)。 我没有编写大型数据库查询的经验。我已经创建了模块的工作原型,现在我正在尝试组织代码/优化查询等。 任务: | id |任务 -------------------- | 1 | task1 | | 2 | task3 | | 3 | task3 | | 4 | task4 | | ... | ... | 资产: | id |资产| -------------------- | 1 | task1 | | 2 | task3 | | 3 | task3 | | 4 | task4 | | ... | ... | TaskAsset: | id | taskid | assetid |系数| ----------------------------------------------- | 1 | 2 | 33 |系数1 | | 2 | 5 | 35 |系数2 | | 3 | 6 | 36 |系数3 | | 4 | 8 | 37 |系数4 | | 5 | ... | ... | ... |$query = \"SELECT TaskAsset.id as id,Assets.asset AS asset,Tasks.task AS task,coefficient
FROM Tasks,Assets,Taskasset
WHERE Taskasset.taskid= Tasks.id AND TaskAsset.assetid = Assets.id\";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
echo $row[\'id\'].\" - \".$row[\'asset\'].\" - \".$row[\'task\'] . $row[\'coefficient\'];
echo \"<br />\";
}
问题:
1.)因此,如果表结构是这样的,我的查询是否有效?
如果是的话,如果我必须连接更多表,简单连接仍然有效吗?喜欢4还是5?
2.)我如何评价查询的有效性?在phpmyadmin中,我可以看到查询运行所花费的时间。我从来没有使用过其他任何东西,因为我的表中的记录很少,所以没关系。
解决方法
我唯一会做不同的事情是显式指定联接。
$query = \"SELECT ta.id as id,a.asset AS asset,t.task AS task,coefficient
FROM TaskAsset ta
JOIN Tasks t ON ta.taskId = t.id
JOIN Assets a ON ta.assetId = a.id\";
这做同样的事情,但是我个人更喜欢它。也就是说,您应该尝试对查询运行query2ѭ。在那您会看到压力点。
, 从最佳角度来看,您的查询很好,假设索引存在于表的id字段中。使用正确的索引,您可以连接更多表,并且性能仍然会很好。
您应该尝试使自己熟悉ANSI连接语法-因为它比旧的FROM x,y,z ...
样式连接更易于阅读-而且也更容易出错!
, 此查询适合于所需的结果。
TaskAssets是一个映射表,旨在通过外键将Task和Asset的列连接在一起。您需要查看结果表中所有三个表的列,因此这是最有效的方法。
, 比查询更重要的是表中的索引。
你在做
SELECT ta.id as id,coefficient
FROM TaskAsset ta
JOIN Tasks t ON ta.taskId = t.id <-- equi join here
JOIN Assets a ON ta.assetId = a.id <-- another equi join.
该查询具有两个等联接。
始终在等联接中涉及的字段上分配索引。
考虑在where
子句中涉及的字段上分配索引(此查询不包含任何查询,但仅此而已)
强烈考虑将索引放在group by
子句中使用的字段上
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。