我有一個龐大的資料庫,其中包含人們的資料,包括(唯一的)姓名、所在國家/地區、出生日期等。我想通過以下方式在這個龐大的資料庫中搜索人員串列:
SELECT * FROM table1 WHERE
NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie'
鑒于此資料集的大小,顯然我在 WHERE 子句中包含的人越多,查詢所需的時間就越長。可以說,我知道我尋找的人位于英國。在我的查詢中包含國家/地區會減少搜索時間嗎?SQL 會知道根據國家/地區修剪表格會減少搜索我想要的所有這些人的時間嗎?或者它實際上只是它需要尋找的附加標準,從而降低了性能?當有多個 OR、AND 部分時,SQL 如何知道哪個順序最有效?我修改后的查詢是:
SELECT * FROM table1 WHERE
COUNTRY = 'UK' AND (NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie')
這會更快嗎?
編輯:我沒有提到的另一件事是沒有索引
uj5u.com熱心網友回復:
如果該表沒有您所說的索引,那么您搜索中的術語實際上是無關緊要的。無論如何,搜索將檢查每一行。即,“表掃描”。
一旦查詢檢查了給定的行,它至少需要評估一些搜索詞。但是獲取一行進行檢查的成本遠高于您顯示的搜索詞。
以此類推:假設您正在電話簿中搜索。您決定以蠻力方式搜索,閱讀書中的每一頁。所以現在您要問是搜索一個名字還是三個名字的成本更高。答案是,您在閱讀書中的每一頁上花費的時間要多出幾個數量級,而不是根據字母順序進行有效搜索,因為對要搜索的姓名數量進行微優化似乎很愚蠢。
您最好在這對列上添加索引:(COUNTRY, NAME)按此順序。然后優化器將立即將搜索范圍縮小到行組,COUNTRY='UK'在這些行組中,它將對少數名稱進行范圍搜索。
就像您在電話簿中搜索一個特定的LAST_NAME和三個不同的FIRST_NAMEs 一樣。利用本書的排序順序將極大地幫助您。
您可能會喜歡我的演示文稿如何設計索引、Really或視頻。
uj5u.com熱心網友回復:
包含更多條件實際上會加快您的查詢結果。您要查找的資料越精確,需要回傳的資料就越少。如果我正在尋找約翰。如果我只看德克薩斯州,那么約翰的名單就會小得多。
uj5u.com熱心網友回復:
你可以簡化
NAME = 'Alice' OR NAME = 'Bob' OR NAME = 'Charlie'
到
NAME IN ('Alice', 'Bob','Charlie')
第一個查詢將受益于
INDEX(name)
第二個將受益更多
INDEX(country, name)
如果沒有合適的索引,它將讀取并查看“這個龐大的資料庫”中的每一行。有了合適的索引,它可以跳到索引中的正確位置,讀取幾行,然后在資料中查找它們。快多了。
另外,請確保有一個PRIMARY KEY.
uj5u.com熱心網友回復:
如果您不想向表中添加索引,那么答案很簡單:
包含所有條件的查詢將通過單次全表掃描解決,并將回傳您想要的所有行。
現在,如果您可以添加索引,則可以使用組合查詢UNION ALL來實作高性能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346071.html
