32 lines
1.9 KiB
SQL
32 lines
1.9 KiB
SQL
-- 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;
|