-- ============================================ -- 优化 GetStoreRemainingRights 方法性能的索引 -- ============================================ -- 说明:这些索引专门为统计门店剩余权益功能优化 -- 执行前请检查索引是否已存在,避免重复创建 -- ============================================ -- 1. lq_kd_pxmx (开单品项明细表) 索引 -- ============================================ -- 用于:查询开单品项总数、按会员分组统计、JOIN关联 -- 查询条件:F_IsEffective, F_MemberId, glkdbh -- 索引1:用于F_MemberId IN查询和JOIN -- MySQL 5.7以下版本请先检查索引是否存在,或直接执行(如果已存在会报错,可忽略) CREATE INDEX idx_kd_pxmx_member_effective_glkdbh ON lq_kd_pxmx(F_IsEffective, F_MemberId, glkdbh); -- 索引2:用于JOIN和按会员分组(补充索引,覆盖JOIN场景) CREATE INDEX idx_kd_pxmx_glkdbh_member_effective ON lq_kd_pxmx(glkdbh, F_MemberId, F_IsEffective); -- ============================================ -- 2. lq_kd_kdjlb (开单记录表) 索引 -- ============================================ -- 用于:按门店和时间范围过滤、JOIN关联 -- 查询条件:F_IsEffective, djmd, kdrq -- 索引1:用于门店+时间范围查询(最常用) CREATE INDEX idx_kd_kdjlb_store_date_effective ON lq_kd_kdjlb(djmd, kdrq, F_IsEffective); -- 索引2:用于JOIN(补充,F_Id是主键可能不需要) -- 如果F_Id是主键,则不需要此索引 -- CREATE INDEX IF NOT EXISTS idx_kd_kdjlb_id_effective -- ON lq_kd_kdjlb(F_Id, F_IsEffective); -- ============================================ -- 3. lq_xh_pxmx (消耗品项明细表) 索引 -- ============================================ -- 用于:查询消耗品项总数、按会员分组统计、JOIN关联 -- 查询条件:F_IsEffective, F_MemberId, F_ConsumeInfoId -- 索引1:用于F_MemberId IN查询和JOIN CREATE INDEX idx_xh_pxmx_member_effective_consume ON lq_xh_pxmx(F_IsEffective, F_MemberId, F_ConsumeInfoId); -- 索引2:用于JOIN场景(补充索引) CREATE INDEX idx_xh_pxmx_consume_member_effective ON lq_xh_pxmx(F_ConsumeInfoId, F_MemberId, F_IsEffective); -- ============================================ -- 4. lq_xh_hyhk (消耗会员耗卡表) 索引 -- ============================================ -- 用于:按门店和时间范围过滤、JOIN关联 -- 查询条件:F_IsEffective, md, hksj -- 索引1:用于门店+时间范围查询(最常用) CREATE INDEX idx_xh_hyhk_store_date_effective ON lq_xh_hyhk(md, hksj, F_IsEffective); -- 索引2:用于JOIN(F_Id是主键则不需要) -- CREATE INDEX IF NOT EXISTS idx_xh_hyhk_id_effective -- ON lq_xh_hyhk(F_Id, F_IsEffective); -- ============================================ -- 5. lq_hytk_hytk (退卡记录表) 索引 -- ============================================ -- 用于:按门店和时间范围过滤、JOIN关联 -- 查询条件:F_IsEffective, md, tksj -- 索引1:用于门店+时间范围查询(最常用) CREATE INDEX idx_hytk_hytk_store_date_effective ON lq_hytk_hytk(md, tksj, F_IsEffective); -- 索引2:用于JOIN(F_Id是主键则不需要) -- CREATE INDEX IF NOT EXISTS idx_hytk_hytk_id_effective -- ON lq_hytk_hytk(F_Id, F_IsEffective); -- ============================================ -- 6. lq_hytk_mx (退卡明细表) 索引 -- ============================================ -- 用于:JOIN关联、按会员分组统计 -- 查询条件:F_IsEffective, F_RefundInfoId, F_BillingItemId -- 索引1:用于JOIN lq_hytk_hytk CREATE INDEX idx_hytk_mx_refund_effective ON lq_hytk_mx(F_RefundInfoId, F_IsEffective); -- 索引2:用于JOIN lq_kd_pxmx CREATE INDEX idx_hytk_mx_billing_effective ON lq_hytk_mx(F_BillingItemId, F_IsEffective); -- ============================================ -- 7. 复合索引(补充优化) -- ============================================ -- 如果需要进一步优化,可以考虑以下复合索引 -- lq_kd_pxmx: 覆盖查询(包含F_ProjectNumber,避免回表) -- 注意:此索引较大,请根据数据量决定是否创建 -- CREATE INDEX IF NOT EXISTS idx_kd_pxmx_cover -- ON lq_kd_pxmx(F_IsEffective, F_MemberId, glkdbh, F_ProjectNumber); -- lq_xh_pxmx: 覆盖查询(包含F_ProjectNumber) -- CREATE INDEX IF NOT EXISTS idx_xh_pxmx_cover -- ON lq_xh_pxmx(F_IsEffective, F_MemberId, F_ConsumeInfoId, F_ProjectNumber); -- ============================================ -- 索引创建前的检查(避免重复创建) -- ============================================ -- 执行以下SQL检查索引是否已存在: -- SELECT -- TABLE_NAME, -- INDEX_NAME, -- GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as COLUMNS -- FROM INFORMATION_SCHEMA.STATISTICS -- WHERE TABLE_SCHEMA = DATABASE() -- AND TABLE_NAME IN ('lq_kd_pxmx', 'lq_kd_kdjlb', 'lq_xh_pxmx', 'lq_xh_hyhk', 'lq_hytk_hytk', 'lq_hytk_mx') -- AND INDEX_NAME LIKE 'idx_%' -- GROUP BY TABLE_NAME, INDEX_NAME -- ORDER BY TABLE_NAME, INDEX_NAME; -- ============================================ -- 索引创建后的验证 -- ============================================ -- 执行以下SQL验证索引是否创建成功: -- SELECT -- TABLE_NAME, -- INDEX_NAME, -- GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as COLUMNS, -- NON_UNIQUE, -- CARDINALITY -- FROM INFORMATION_SCHEMA.STATISTICS -- WHERE TABLE_SCHEMA = DATABASE() -- AND TABLE_NAME IN ('lq_kd_pxmx', 'lq_kd_kdjlb', 'lq_xh_pxmx', 'lq_xh_hyhk', 'lq_hytk_hytk', 'lq_hytk_mx') -- AND INDEX_NAME LIKE 'idx_%' -- GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE, CARDINALITY -- ORDER BY TABLE_NAME, INDEX_NAME; -- ============================================ -- 性能测试建议 -- ============================================ -- 1. 创建索引前,记录查询时间 -- 2. 创建索引后,使用相同参数重新测试 -- 3. 使用 EXPLAIN 分析查询计划,确认索引被使用 -- 4. 如果索引未被使用,检查WHERE条件顺序是否匹配索引列顺序 -- ============================================ -- 注意事项 -- ============================================ -- 1. 索引会占用存储空间,请定期监控 -- 2. 索引会影响INSERT/UPDATE性能,但查询性能提升显著 -- 3. 如果表数据量很大,创建索引可能需要较长时间 -- 4. 建议在业务低峰期执行索引创建 -- 5. MySQL不同版本的兼容性: -- - MySQL 8.0+ 支持 CREATE INDEX IF NOT EXISTS -- - MySQL 5.7及以下不支持 IF NOT EXISTS,需要先检查索引是否存在 -- 本文件已移除 IF NOT EXISTS,如索引已存在会报错,可安全忽略 -- 6. 如果报错 "Duplicate key name",说明索引已存在,可以继续执行后面的语句