表结构:
ida int
idb int
name varchar(20)
info text
存在SQL:
select * from scott where ida=? and idb=?
select * from scott where ida=?
select * from scott where idb=?
存在索引:
ind_ida(ida)
ind_idb(idb)
数据分布:
表 1000000 rows
ida不同值个数1000
idb不同值个数900
sql执行计划:
select * from scott where ida=? and idb=? --使用索引:ind_ida
场景一:
当再次插入90000条记录,ida不同值个数未发生变化,idb不同值个数为90900,但统计信息未触发更新阈值autovacuum_analyze_scale_factor,SQL仍使用原执行计划,导致数据库出现性能瓶颈
提问:基于此类场景有何优化措施能避免或尽量降低对数据库的影响?
针对这种场景,可以考虑以下优化措施:
1.手动触发VACUUM ANALYZE命令,更新统计信息,让优化器能够更准确地选择执行计划。
2.增加autovacuum_analyze_scale_factor的值,使得统计信息更新更频繁,以便更快地适应数据变化。
3.考虑使用分区表,将数据按照某个维度进行分区,比如按照时间、地区等,这样可以减少单个表的数据量,提高查询效率。
4.优化SQL语句,尽量避免全表扫描,使用索引等方式提高查询效率。
5.增加硬件资源,比如增加CPU、内存等,提高数据库的处理能力。
综上所述,对于这种场景,可以通过更新统计信息、使用分区表、优化SQL语句、增加硬件资源等方式来避免或降低对数据库的影响。