2013-02-28 59 views
0

我有这个简单的连接,但工作很好,但可怕的慢,我认为,因为科技表是非常大的。有很多uid的实例,因为它跟踪uid的时间戳,因此是独特的。提高查询速度的最佳方法是什么?改进JOIN查询速度

SELECT DISTINCT tech.uid, 
       listing.empno, 
       listing.firstname, 
       listing.lastname 
FROM tech, 
     listing 
WHERE tech.uid = listing.empno 
ORDER BY listing.empno ASC 
+1

请,向我们展示了'EXPLAIN'和你的表结构。这就像引入检查引擎灯的汽车,而不是读取诊断信息。使用明确的'JOIN'语法也是更好的和*标准的*练习 – Kermit 2013-02-28 20:45:43

+0

您是否研究过使用任何索引? – 2013-02-28 20:48:15

+3

起初 - 如果没有索引,您可以在tech.uid和listing.empno上添加索引。 – Kamil 2013-02-28 20:50:20

回答

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; 

张贴解释结果,以便我们可以得到更好的见解。

希望它能帮助,

+0

完美,我已经根据说明添加了索引,并且您的回答很快就会吸烟。感谢解释提示,我将在未来使用它。 – 2013-02-28 20:59:50

1
  1. 这是非常简单的查询。只有你可以在SQL中执行 - 如果没有索引,则可以在JOIN/WHERE和ORDER BY子句(tech.uid,listing.empno)中使用的字段上添加索引

  2. 如果有JOIN字段值为NULL值 - 他们可能会毁了你的表现。您应该在WHERE条款(WHERE tech.uid is not null and listing.empno not null)中过滤它们。如果在NULL字段上有JOIN的许多行 - 该数据可能会产生笛卡尔的结果(不确定这是如何在英语中称为),可能包含大量的行。

  3. 您可能会更改MySQL配置。有对性能调节的许多选项,如key_buffer_size的,sort_buffer_size的值,tmp_table_size的,max_heap_table_size,read_buffer_size等

+0

回复:你的#2。你是说使用显式内连接可以产生比隐式连接更快的性能? – 2013-02-28 21:03:57

+0

@ PM77-1也许你是对的。我通过回答纠正并添加了另一个提示。 – Kamil 2013-02-28 21:14:01