MySQL大表INFO、HISTORY查询性能低下,如何重构表结构优化?
MySQL表性能优化方案
表结构与索引调整
INFO表(60万+记录)
- 首先修正字段名问题:
group、key都是MySQL保留关键字,每次查询都需要额外解析,建议修改为非保留字,比如group改为group_name,key改为biz_unique_key,避免语法风险和解析损耗。 - 新增联合唯一索引:
UNIQUE KEY idx_group_key (group,key),该索引可同时覆盖三类高频操作:SELECT COUNT(group) FROM INFO WHERE group = ?直接走索引统计,无需回表,毫秒级返回结果SELECT * FROM INFO WHERE group = ? and key = ?全条件匹配索引,无需全表扫描- 自动约束
group+key的唯一性,避免重复数据插入
HISTORY表(500万+记录)
- 修正字段名问题:
index是MySQL保留关键字,建议修改为history_id之类的非保留字。 - 新增联合唯一索引:
UNIQUE KEY idx_prod_info (product_name, info_id),完全匹配高频查询SELECT * FROM HISTORY WHERE product_name = ? and info_id = ?的过滤条件,查询直接走索引,避免500万级全表扫描。
业务逻辑优化
原有先查询再判断插入的逻辑可以直接替换为INSERT IGNORE语句,省去一次查询请求,数据库交互量直接减半:
- INFO表插入逻辑替换为:
INSERT IGNORE INTO INFO (`group`, `key`) VALUES ("GrB", "EEE")
根据返回的影响行数判断:返回1为插入成功(原无对应记录),返回0为记录已存在,无需额外执行SELECT查询。
2. HISTORY表插入逻辑替换为:
INSERT IGNORE INTO HISTORY (product_name, `group`, info_id) VALUES ("ProductA", "GrC", "4")
判断逻辑同上。
优化效果
所有高频查询均走覆盖索引,单条查询耗时可从5秒降至10ms以内,同时减少一半的数据库请求,整体性能提升至少两个数量级。
内容的提问来源于stack exchange,提问作者Donghyun
相关产品推荐
相关产品推荐

