数据库查询优化

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之类的会使索引失效,避免使用

为了避免联合查询可以适当使用冗余数据

可以根本不建立外键,在多表查询时候进行多次查询再手动进行数据组合

 

posted @ 2020-01-27 21:49  隔壁古二蛋  阅读(114)  评论(0编辑  收藏  举报