加快查询速度(按整数列排序)

ldxq2e6h  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(327)

我正在尝试从数据库表中检索行,希望它们具有 provider_count 大于0的。我想用一个 provider_count 低于0作为最后的结果。
我目前正在对一个有大约1百万条记录的表使用以下查询:

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

不幸的是,order by使得查询速度非常慢,provider\u count列上已经有了一个索引,我尝试过向provider\u count+search\u name添加索引,但是没有显示出任何关于速度的改进。
我还尝试通过删除where语句并将order by改为:

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

但这会导致相当相同的执行时间(大约5秒)。没有order by,查询执行时间只有0.005s
关于如何改进这个查询有什么建议吗?
我的产品表的架构:https://www.db-fiddle.com/f/azbzxirrsltxcmldcve9dp/0

km0tfn4u

km0tfn4u1#

我要试着回答-你的问题应该做什么还不完全清楚。您提供的fiddle不运行您的查询(由于提到了group by bug@rickjames)。
我相信您的目的是检索products表中的每一条记录,以获得提供者列表。您希望提供程序为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子句意味着,如果有超过48条提供程序计数大于0的记录,那么最后一个子句将不会显示在结果集中。
当然,你可以让它更简单:

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

相关问题