-- 20261009 商户投递记录分页索引(可重复执行) -- -- 背景:/app-message/pc/deliveries 页面查询(source_mch_id + recipient_user_id 过滤, -- create_time desc, id desc 排序)在 third_push_delivery 上仅有 -- (tenant_id, source_mch_id, create_time, del_flag) 索引,recipient_user_id -- 不在索引中,需沿商户范围逐行回表过滤;表增长到约 21 万行后实测 COUNT 约 2.2 秒。 -- 方案:新增与页面查询形态精确匹配的复合索引,等值(mch, recipient)后按 create_time 有序, -- 分页与 COUNT 均为索引前缀范围扫描;无 recipient 条件时退回既有商户时间索引,不受影响。 -- 执行:Online DDL(INPLACE + LOCK=NONE,不锁表),21 万行预计 5~15 秒,建议低峰执行。 -- 回滚:文末 DROP INDEX。 USE pjcloudx_thirdparty; SET @ddl = IF( (SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema = 'pjcloudx_thirdparty' AND table_name = 'third_push_delivery' AND index_name = 'idx_third_push_delivery_mch_recipient') = 0, 'ALTER TABLE third_push_delivery ADD INDEX idx_third_push_delivery_mch_recipient (tenant_id, source_mch_id, recipient_user_id, create_time, id), ALGORITHM=INPLACE, LOCK=NONE', 'SELECT ''skip: idx_third_push_delivery_mch_recipient 已存在'' AS msg'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; ANALYZE TABLE third_push_delivery; -- ============ 执行后验证(期望 key=idx_third_push_delivery_mch_recipient) ============ -- EXPLAIN SELECT id FROM pjcloudx_thirdparty.third_push_delivery -- WHERE tenant_id = 1 AND source_mch_id = 2078051759222632449 -- AND recipient_user_id = 2034824566572941314 -- ORDER BY create_time DESC, id DESC LIMIT 20; -- ============ 回滚(如需) ============ -- ALTER TABLE pjcloudx_thirdparty.third_push_delivery DROP INDEX idx_third_push_delivery_mch_recipient;