Mysql
為什麼我的查詢需要這麼長時間?
為了快速計算一些特徵以供以後計算,我嘗試儲存一個表格,該表格允許查找已預先計算的位置之間的距離。我正在使用Python和SQLalchemy。我的表中有76,807,696行。但是,單個查詢需要300秒以上。
我的數據庫定義為:
class LocationsLookupTable(db.Model): """Use this class to create the database Model for the locations lookup table. This class is used for creating the database table Model for the locations lookup table. It will store the ID pair and their distance value. There will also be a unique ID for each value in the database table. """ id = db.Column(db.Integer, primary_key=True, unique=True) firstId = db.Column(db.Integer, nullable=False) secondId = db.Column(db.Integer, nullable=False) firstLocationGeoPointX = db.Column(db.Float) firstLocationGeoPointY = db.Column(db.Float) secondLocationGeoPointX = db.Column(db.Float) secondLocationGeoPointY = db.Column(db.Float) distanceValue = db.Column(db.Integer)
我正在使用以下查詢查詢它:
result = models.LocationsLookupTable.query.filter_by( firstId=firstId, secondId=secondId).first()
我有一些關於為什麼性能如此糟糕的理論。首先是我的行太多了。第二個是數據庫不適合這個任務。第三是我的查詢沒有很好的表述。然而,這是我第一次嘗試使用任何類型的數據庫,所以我想問一下在對項目進行任何重大更改之前如何加快查詢速度。
編輯:我解決了我的問題。@ypercubeᵀᴹ 確實是正確的,因為解決方案是索引我正在查詢的列。SELECT 語句現在非常快,大約需要 0.03 秒。謝謝你。
我有一些關於為什麼性能如此糟糕的理論。
讓我們來看看。
首先是我的行太多了。
可能不是。(SQL) DBMS 中的行數沒有限制。如今,8000 萬行並不多。
第二個是數據庫不適合這個任務。
不太可能。我們不知道您使用哪種 DBMS(Postgres?MySQL?SQLite?SQL Server?有數百個),但我認為它們中的任何一個都可以處理看似簡單的查詢。
第三是我的查詢沒有很好的表述。
不,看起來不錯。生成的查詢將如下所示:
SELECT id, firstid, secondid, ..., distanceValue FROM LocationsLookupTable WHERE firstId = ? AND secondId = ? ;
那麼,是什麼原因造成的呢?
如果這就是創建表的所有程式碼,那麼缺少的是索引。缺少它們,數據庫優化器/規劃器必須創建一個掃描整個表的查詢計劃。桌子雖然不大,但也不算小。
添加索引
(firstid, secondid)
將大大提高性能。然而 300 秒看起來太長了,即使對於表掃描也是如此,因此也應該檢查硬體或 DBMS 設置。