我有这个简单的连接,效果很好,但我觉得很慢,因为技术表非常大。有许多uid实例,因为它跟踪uid的时间戳,因此是不同的。加快查询速度的最佳方法是什么?
SELECT DISTINCT tech.uid,
listing.empno,
listing.firstname,
listing.lastname
FROM tech,
listing
WHERE tech.uid = listing.empno
ORDER BY listing.empno ASC
答案 0 :(得分:4)
首先在各自的表上添加一个索引到tech.UID和listing.EmpNo。 在确定有索引之后,您可以尝试重写这样的查询:
SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName
FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo
ORDER BY listing.EmpNo ASC;
如果它仍然不够快,请在查询之前放置EXPLAIN一词,以获得有关查询执行计划的一些提示。
EXPLAIN SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName
FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo
ORDER BY listing.EmpNo ASC;
发布解释结果,以便我们获得更好的洞察力。
希望它有所帮助,
答案 1 :(得分:1)
这是一个非常简单的查询。如果没有索引,只能在SQL中执行 - 可以在JOIN / WHERE和ORDER BY子句(tech.uid,listing.empno)中使用的字段上添加索引。
如果JOIN
个字段的值为NULL
,则可能会破坏您的效果。您应该在WHERE
子句(WHERE tech.uid is not null and listing.empno not null
)中过滤它们。如果JOIN
字段上有许多行NULL
- 该数据可能会产生笛卡尔结果(不确定这是如何用英语调用的)可能包含大量行数。
您可以更改MySQL配置。有许多选项可用于性能调整,例如key_buffer_size,sort_buffer_size,tmp_table_size,max_heap_table_size,read_buffer_size等。