1

我有这个简单的连接,效果很好,但我认为速度非常慢,因为技术表非常大。有许多 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 
4

2 回答 2

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;

发布解释结果,以便我们获得更好的洞察力。

希望能帮助到你,

于 2013-02-28T20:53:17.890 回答
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)中过滤它们。如果有很多行带有JOINonNULL字段 - 该数据可能会产生笛卡尔结果(不确定这在英语中是如何调用的)可能包含大量行。

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

于 2013-02-28T20:56:05.567 回答