优化使用 ORDER BY 加载时间较长的 MySQL 请求

问题描述 投票:0回答:1

我面临 MySQL 查询的性能问题,即使对所需的列进行索引等...加载第 10 个第一个结果需要超过 5 秒的时间,这是由于

ORDER BY
,当我删除它时,加载仅需几毫秒!

这是 SQL 查询:

select
    *
from
    `feedbacks` f
inner join carriers c on c.id = f.carrier_id 
where
    c.id in (25619, 25620, 25621, 25637, 25758, 25759, 25760, 25761, 25762, 25763, 25976, 25983, 26459, 26460, 27003, 27006, 27052, 27295, 27325, 27387, 27532, 27533, 27534, 27535, 27536, 27537, 27538, 27541, 27542, 27543)
    and f.`deleted_at` is null
order by
    f.`created_at` desc
limit 10 offset 0

feedbacks
表上有一些索引:

feedbacks_status_id_foreign BTREE   FALSE   status_id
feedbacks_push_id_foreign   BTREE   FALSE   push_id
feedbacks_created_at_index  BTREE   FALSE   created_at
feedbacks_carrier_id_created_at_token_index BTREE   FALSE   carrier_id,created_at,token
feedback_test_index BTREE   FALSE   created_at,carrier_id
PRIMARY BTREE   TRUE    id

carriers
表内:

idx_creator_id  BTREE   FALSE   creator_id
carriers_team_id_foreign    BTREE   FALSE   team_id
carriers_slug_unique    BTREE   TRUE    slug
carriers_slug_organization_id_created_at_index  BTREE   FALSE   slug,created_at
PRIMARY BTREE   TRUE    id

但即使有了所有这些索引,也需要很长时间!

欢迎对此问题提供更多帮助:D

mysql database query-optimization
1个回答
0
投票

技巧是找到问题中行的 id,然后获取额外的列。这可以避免通过排序等方式拖拽大量垃圾,并且可以允许使用“覆盖”索引:

select  f2.*, c.*
    FROM  (
        SELECT  f.id
            FROM  `feedbacks` f
            WHERE  f.carrier_id in (25619, 25620, 25621, 25637, 25758,
                        25759, 25760, 25761, 25762, 25763, 25976, 25983, 26459,
                        26460, 27003, 27006, 27052, 27295, 27325, 27387, 27532,
                        27533, 27534, 27535, 27536, 27537, 27538, 27541, 27542,
                        27543 
                          )
              and  f.`deleted_at` is null
            order by  f.`created_at` desc
            limit  10 offset 0 
          ) AS f1
    JOIN  carriers AS c  ON c.id = f1.carrier_id
    JOIN  feedbacks AS f2  ON f2.id = f1.id
    ORDER BY  f2.`created_at` desc  -- yes, repeated
    ;    

与:

feedbacks:  INDEX(deleted_at, carrier_id, created_at,  id)
© www.soinside.com 2019 - 2024. All rights reserved.