1. 程式人生 > >提高查詢資料速度

提高查詢資料速度

          在實際專案中,通過設計表架構時,設計系統結構時,查詢資料時綜合提高查詢資料效率

1.適當冗餘

資料庫在設計時遵守三正規化,同時業務資料(對資料的操作,比如資料稽核,對某人評分等)和基礎資料(比如資料詳情,使用者描述等)要分開儲存,放在不同表中。在設計資料庫時,三正規化能夠最大限度的節省 資料庫儲存所需的空間,可是缺點是 在查詢,修改等操作時,會造成查詢緩慢,效率低下。所以對於經常查詢的欄位應該適當的新增到同一個表中,適當冗餘,不必嚴格按照三正規化進行設計,這樣 通過捨棄部分儲存空間,提高查詢效率,能夠得到更好的使用者體驗。

For example:使用者基本資訊表(使用者名稱,密碼,身高,體重,三圍),使用者資訊稽核表(稽核狀態,使用者id);系統需求:要求顯示稽核結果時知道每個使用者的使用者名稱和稽核狀態;那麼嚴格按照三正規化,需要查詢兩張表;如果把使用者名稱新增到 使用者資訊稽核表 中時,只需查詢一張表,查詢時間肯定小於多表查詢。

冗餘欄位新增條件:經常進行查詢的欄位放在同一個表中,避免多表查詢

2.資料查詢時,少用in進行查詢

in進行的是全表查詢,不使用索引

For instance:

用關聯查詢:

用in進行巢狀查詢:

所以儘量少用in進行查詢,多用其他的進行代替;如 between 2 and 4 代替  in (2,3,4) 等等。

 3.儘量少設定外來鍵關聯

在專案初期進行版本迭代時,對於以後版本無法預測的變更,儘量少使用外來鍵關聯,減少表間依賴強度,為以後版本設計提供基礎。因為外來鍵關聯時,修改刪除等操作非常繁雜。

在保證資料完整性時,儘量少設定外來鍵關聯,省去每次查詢外來鍵是否存在的時間。比如 國家免檢產品,在保證產品質量(本表)的前提下,充分相信製造商(外來鍵對應的表)

4.使用redis快取機制

對於重複查詢,沒有改變的資料,可以使用redis快取機制,直接訪問記憶體資料,不再訪問資料庫,減少訪問資料庫的時間(資料庫在硬碟上,redis快取在記憶體中)。思路是:讀取資料庫資料到redis快取中,從redis中取資料給前端。如果涉及到資料修改不大的,可以修改到redis中,固定時間同步到資料庫,保證資料統一完整性。

5.查詢時 儘量不要用 select * from tables;

*代表取表中一組資料到記憶體中,增加記憶體消耗,只取需要的欄位,如 select id from tables;

  在python的sqlalchemy庫時,儘量不要用  Table.query.filter_by(id=1).first()  ==》select * from Table where id=1   ;應該使用db.session.query(Table.id).filter(Table.id==1).fitst()  ==》 select id from tables where id=1;

6.使用index索引進行查詢優化

把索引建在經常查詢的欄位,主鍵,外來鍵,WHERE子句中的資料列,出現在關鍵字order by、group by、distinct後面的欄位。

7.在使用order by進行排序時,最好被排序的欄位是索引

大致思路:減少資料儲存空間,減少訪問資料庫次數,減少讀取到記憶體中的資料量。