0、寫在前面
做系統的時候各種聯表跨表查詢,導致查詢巨慢無比,想了各種辦法優化,記錄一下
有些想法還沒應用到專案上,應用上後再來更新
1、思路
整體思路是先找出查詢慢的點,主要都發生在n級聯表跨表查詢的時候,快取+優化查詢速度來解決
1.1 快取
查詢結果直接存到redis裡,這樣後續查詢就不用再走mysql了
1快取為了保證資料同步,再有增刪改操作後,還需要清除相對應的快取#快取key
2 redis_key = '
show_getdepartmentsumstatistics_%s
'%(id)3#
有快取返回快取,無快取查詢資料庫
4 rdata ={}
5if redis_cache.hget(redis_key, '
data'):
6 rdata.update(json.loads(redis_cache.hget(redis_key, '
data
')))
這裡使用觸發器來解決
觸發器:
監視誰:table
監事動作:insert、update、delete
觸發事件:after
觸發事件:清空快取
1觸發器1.2 慢查詢優化#case表,增刪改
2 @sql_event.listens_for(case, '
after_insert')
3def
4redis_cache.flushdb()
56 @sql_event.listens_for(case, '
after_delete')
7def
8redis_cache.flushdb()
910 @sql_event.listens_for(case, '
after_update')
11def
12 redis_cache.flushdb()
這個目前還是理論,還沒應用到專案上,看了一些優化教程
主要的優化思路就是建索引和避免導致不使用索引查詢的操作、還有避免使用聯合查詢
比如in、like之類的會使索引失效,避免使用
為了避免聯合查詢可以適當使用冗餘資料
可以根本不建立外來鍵,在多表查詢時候進行多次查詢再手動進行資料組合
資料庫查詢優化
方法 1 1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。步驟閱讀 22.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is...
資料庫查詢優化
本記載,用於保留面對大資料量時,查詢速率待優化,只記錄要點,具體如何操作,還需查詢 1 索引優化 通過建立合理高效的索引,提高查詢的速度.2 sql優化 根據需求,組織優化sql語句,使查詢效率達到最優,在很多情況下要考慮索引的作用 3 水平拆分 如果表的資料量增長特變塊,索引帶來的效能優化可能達到...
資料庫查詢優化
1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄 如 select id from t where num is null 可以在nu...