目录
问题说明
解决方案 - 场景A
解决方案 - 场景B
解决方案 - 场景C
深入理解索引 - 索引的逻辑结构
深入理解索引 - 索引的三个特点
深入理解索引 - 索引的注意事项
问题说明:
系统上线后,用户数据不断增长,从最初的几十万记录发展至上千万、甚至上亿条记录。运维人员反馈原有的存储过程运行效率愈发低下。review时发现以下可改进之处:
场景A:数据表的索引与查询语句子条件(where)筛选字段无关,未合理创建索引;
场景B:业务逻辑分析不足,产生非必要的表关联,50%的语句可改写为单表查询语句;
场景C:数据表本身已有相关索引,但在查询时未正确使用索引;
各场景解决方案: 由于不方便用项目代码举例,以下sql涉及的字段名、数据表名均用别名替换。
场景A:.必要表连接 + 无索引,可调整为 必要表连接 + 索引检索
表b:file_name,file_month,file_type(索引I:file_month)
表d: fee,file_name,file_month(无索引)
SELECT fee
FROM d
WHERE file_name IN (SELECT file_name FROM b WHERE file_month=202002 and file_type= 'XXX');
【执行计划 - 必要表连接 + 无索引】
【优化分析】由于业务层面上,B与D表的file_month不等价,需保留表连接。执行计划中的索引扫描“INDEX(FAST FULL SCAN)”用到了b表的索引I(file_month),可在 表d 的file_name列新建索引提升查询性能。
【新建索引】CREATE INDEX d_file_name_idx ON d (file_name) ;
【执行计划 - 必要表连接 + 索引检索】
【成本优化】:269416 -- 1087
场景B:非必要表连接 + 无索引 ,可调整为 无表连接 + 索引