【发布时间】:2015-12-25 12:18:58
【问题描述】:
概述:
我有一个构建查询语句的系统。其中一些必须根据传递到系统的设置参数将一些表连接到其他表。在对创建的查询运行一些性能测试时,我注意到一些查询正在执行 FULL TABLE SCANS,在许多情况下,根据我所读到的内容,这对大表不利。
我想做的事:
1 - Remove the full table scans
2 - Speed up the Query
3 - Find out if there is a more efficient query I can have the system build instead
查询:
SELECT a.p_id_one, b.p_id_two, b.fk_id_one, c.fk_id_two, d.fk_id_two,
d.id_three, d.fk_id_one
FROM ATable a
LEFT JOIN BTable b ON a.p_id_one = b.fk_id_one
LEFT JOIN CTable c ON b.p_id_two = c.fk_id_two
LEFT JOIN DTable d ON b.p_id_two = d.fk_id_two
WHERE a.p_id_one = 1234567890
查询时间
Showing rows 0 - 10 (11 total, Query took 0.0016 seconds.)
当前问题:
1 - 我的系统/DBMS (phpmyadmin) 的查询时间在 0.0013 秒到 0.0017 秒之间。
- 我做了哪些修复工作?
全表扫描或“ALL”类型的查询正在表(“BTable”、“DTable”)上运行,所以我尝试在适当的 id 上使用 FORCE INDEX。 使用 FORCE INDEX 会删除全表扫描,但不会加快 表现。 我仔细检查了我的 fk_constraints 和索引关系,以确保我没有遗漏任何东西。到目前为止,一切都已验证完毕。
2 - 顾问显示多个警告,其中一些与全表扫描和索引有关。
问题:
假设所有索引都可用并已创建
1 - 有没有更好的方法来执行这个查询?
2 - 多少个连接是太多连接?
3 - 连接可能是问题吗?
4 - 问题是否存在于 WHERE 子句中?
5 - 我可能错过了哪些优化技术/工具?
6 - 我怎样才能让这个查询以 0.0008 和 0.0001 之间的速度执行?
如果需要图像和视觉效果来帮助澄清我的情况,请在下面的评论中提问。我感谢任何和所有的帮助。
谢谢你=)
【问题讨论】:
-
我认为查询没有更好的选择
-
请发布EXPLAIN 输出。
-
我已将解释添加到问题中,请查看谢谢。
-
如果 0.0017s 对你来说太慢了,这个问题肯定不止这个查询。请为您尝试解决的整体问题提供上下文,以便我们理解您为什么需要此查询低于 0.001 秒。很可能我们将能够更好地帮助解决整体问题,而不是试图进一步压缩这个已经超快的查询。
-
我将深入研究我在这个问题中可能遗漏的所有上下文片段,并在编辑后的更新中发布。
标签: mysql sql left-join query-optimization query-performance