数据库查询优化
0、写在前面
做系统的时候各种联表跨表查询,导致查询巨慢无比,想了各种办法优化,记录一下
有些想法还没应用到项目上,应用上后再来更新
1、思路
整体思路是先找出查询慢的点,主要都发生在N级联表跨表查询的时候,缓存+优化查询速度来解决
1.1 缓存
查询结果直接存到redis里,这样后续查询就不用再走mysql了
1 #缓存key 2 redis_key = 'show_getDepartmentSumStatistics_%s'%(id) 3 # 有缓存返回缓存,无缓存查询数据库 4 rData = {} 5 if redis_cache.hget(redis_key, 'data'): 6 rData.update(json.loads(redis_cache.hget(redis_key, 'data')))
为了保证数据同步,再有增删改操作后,还需要清除相对应的缓存
这里使用触发器来解决
触发器:
监视谁:table
监事动作:insert、update、delete
触发事件:after
触发事件:清空缓存
1 #case表,增删改 2 @sql_event.listens_for(case, 'after_insert') 3 def case_after_insert(mapper, connection, target): 4 redis_cache.flushdb() 5 6 @sql_event.listens_for(case, 'after_delete') 7 def case_after_delete(mapper, connection, target): 8 redis_cache.flushdb() 9 10 @sql_event.listens_for(case, 'after_update') 11 def case_after_update(mapper, connection, target): 12 redis_cache.flushdb()
1.2 慢查询优化
这个目前还是理论,还没应用到项目上,看了一些优化教程
主要的优化思路就是建索引和避免导致不使用索引查询的操作、还有避免使用联合查询
比如in、like之类的会使索引失效,避免使用
为了避免联合查询可以适当使用冗余数据
可以根本不建立外键,在多表查询时候进行多次查询再手动进行数据组合