快速查询缓慢创建表

时间:2017-01-20 03:34:32

标签: mysql sql

sample data

我在使用select关键字创建表时遇到问题(运行速度很慢)。查询仅采用具有最新输入日期的动物的详细信息。该查询将用于内部连接另一个查询。

SELECT *
FROM amusementPart a 
INNER JOIN (
    SELECT DISTINCT name, type, cageID, dateOfEntry 
    FROM bigRegistrations
    GROUP BY cageID
) r ON a.type = r.cageID

但是由于性能低下,有人建议我采取措施来提高性能。 1)使用临时表,2)存储结果并使用它并将其加入另一个语句。

   use myzoo 
   CREATE TABLE animalRegistrations AS 
   SELECT DISTINCT name, type, cageID, MAX(dateOfEntry) as entryDate 
   FROM bigRegistrations
   GROUP BY cageID

不幸的是,它仍然很慢。如果我只使用select语句,结果将在1-2秒内显示。但是,如果我添加创建表,查询将需要很长时间(约25分钟)

改善查询时间的任何好方法?

编辑:大型注册表的大小约为350万行

4 个答案:

答案 0 :(得分:1)

这是一个多部分问题。

  1. 使用临时表
  2. 不要使用Distinct - 将所有列分组以使其不同(不要忘记检查索引)
  3. 检查SQL执行计划

答案 1 :(得分:1)

请按以下方式尝试查询以实现The query is to take only the details of the animal with the latest entry date. that query will be used to inner join another query,您使用的查询不是根据您的要求获取记录,而且会更快:

    SELECT a.*, b.name, b.type, b.cageID, b.dateOfEntry
FROM amusementPart a
INNER JOIN bigRegistrations b ON a.type = b.cageID
INNER JOIN (SELECT c.cageID, max(c.dateOfEntry) dateofEntry 
                FROM bigRegistrations c 
            GROUP BY c.cageID) t ON t.cageID = b.cageID AND t.dateofEntry = b.dateofEntry

建议在cageIDdateofEntry

上编制索引

答案 2 :(得分:0)

您是否尝试过解释以了解该计划与执行计划的不同之处?

另外,我发现在使用select执行insert(select)和表创建时,某些DB中可能存在锁定问题。我在MySQL中运行它,它解决了我遇到的一些死锁问题。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

答案 3 :(得分:0)

查询运行速度如此之慢的原因可能是因为它正在创建基于所有350万行的临时表,而实际上您只需要其中的一部分,即与您的joinPart连接匹配的bigRegistration。第一个单选select语句更快b / c SQL足够聪明,知道它只需要计算a.type = r.cageID所在的bigRegistrations。

我建议您不需要临时表,您的第一个查询非常简单。相反,您可能只需要一个索引。您可以通过研究估计的执行计划或在数据库优化顾问中运行查询来手动确定。我的猜测是你需要创建一个类似于下面的索引。请注意我首先通过cageId索引,因为这是你加入到amusementParks的东西,这样可以帮助SQL将结果缩小到最快。但是我猜了一下 - 查看查询计划或调整顾问以确定。

CREATE NONCLUSTERED INDEX IX_bigRegistrations ON bigRegistrations
(cageId, name, type, dateOfEntry)

此外,如果您想要动物的最新录入日期,我认为您想要此查询而不是您正在使用的查询。我假设PK全部为4列。

SELECT name, type, cageID, dateOfEntry 
FROM bigRegistrations BR
WHERE BR.dateOfEntry =
    (SELECT MAX(BR1.dateOfEntry)
    FROM bigRegistrations BR1
    WHERE BR1.name = BR.name
    AND BR1.type = BR.type
    AND BR1.cageID = BR.cageID)