使此查询更快(按整数列排序)

时间:2019-01-09 08:50:06

标签: mysql performance mysqli

我正在尝试从数据库表中检索行,并且希望它们的provider_count大于0的行。我想检索provider_count小于0的记录作为最后的结果。

我目前在具有约100万条记录的表上使用以下查询:

SELECT
    `products`.*
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
GROUP BY
    `products`.`search_name`
ORDER BY
    FIELD(provider_count, 12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
LIMIT 48

不幸的是,排序方式使查询速度非常慢,provider_count列上已经有一个索引,并且我尝试将索引添加到provider_count + search_name中,但是在速度方面没有任何改善。

我还试图通过删除WHERE语句并将ORDER BY更改为以下顺序来更改顺序:

ORDER BY `products`.`provider_count` = 0 ASC, `products`.`provider_count`

但这导致执行时间完全相同(给定或花费5秒)。 没有排序依据,查询执行时间仅为0.005s

关于如何改进此查询的任何建议?

我的产品表的架构: https://www.db-fiddle.com/f/azBzXiRRsLtXCmLDCVe9DP/0

1 个答案:

答案 0 :(得分:0)

我要尝试来回答-尚不清楚您的查询应该做什么。您提供的Fiddle不会运行您的查询(由于提到了GROUP BY错误@rickJames)。

我相信您的意图是检索产品表中的每条记录,以获取提供商列表。您希望提供程序为0的记录在该列表的末尾。您希望查询快速执行。

您应该可以通过以下查询来实现:

SELECT
    `products`.*, 1 as no_provider
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58)

union
SELECT
    `products`.*, 2 as no_provider
FROM
    `products`
WHERE
    `products`.`provider_count` = 0
order by no_provider, provider_count
LIMIT 48

您的limit子句意味着如果提供者计数> 0的记录超过48条,则最后一个子句将不会显示在结果集中。

您当然可以使它更简单:

SELECT
    `products`.*
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
ORDER BY provider_count desc