我面临 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
技巧是找到问题中行的 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)