品牌监测数据量大了以后查询变慢。分享我做的索引优化。
问题:brand_checks表已有500万条数据,以下查询需要3秒:
SELECT DATE(checked_at) as date,
AVG(CASE WHEN mentioned = 1 THEN 1 ELSE 0 END) * 100 as visibility
FROM brand_checks
WHERE brand_id = 42
AND platform = '飞书机器人'
AND checked_at >= '2026-03-01'
GROUP BY DATE(checked_at)
code
ORDER BY date;- type: ALL(全表扫描)
- rows: 5,000,000
- Extra: Using where; Using filesort
优化方案:
1. 添加联合索引
ALTER TABLE brand_checks
code
ADD INDEX idx_brand_platform_date (brand_id, platform, checked_at);ALTER TABLE brand_checks
code
ADD INDEX idx_brand_visibility (code
);ALTER TABLE brand_checks
code
PARTITION BY RANGE (YEAR(checked_at) * 100 + MONTH(checked_at)) (PARTITION p202602 VALUES LESS THAN (202603),
PARTITION p202603 VALUES LESS THAN (202604),
PARTITION p202604 VALUES LESS THAN (202605),
PARTITION p_future VALUES LESS THAN MAXVALUE
code
);- type: range
- rows: 12,000
- Extra: Using index condition
查询时间:50ms
其他优化技巧:
4. 使用汇总表做预计算
code
CREATE TABLE brand_daily_summary (platform VARCHAR(50),
check_date DATE,
total_checks INT,
mentioned_count INT,
visibility DECIMAL(5,2),
PRIMARY KEY (brand_id, platform, check_date)
code
);INSERT INTO brand_daily_summary
SELECT brand_id, platform, DATE(checked_at),
COUNT(*), SUM(mentioned),
AVG(mentioned) * 100
FROM brand_checks
WHERE DATE(checked_at) = CURDATE() - INTERVAL 1 DAY
code
GROUP BY brand_id, platform, DATE(checked_at);5. Redis缓存热点查询
对于首页dashboard展示的数据,TTL设置为1小时。品牌数据不需要实时更新。
(场景参考:珠海本地企业试点)