簡體   English   中英

加快索引連接

[英]Speeding up Joins with Indexes

我知道使用索引可以幫助加快兩個或多個表的聯接。 以下示例使用其共享的department_id列連接兩個表emps和depts:

select last_name, department_name 
from emps join depts 
using(department_id);

我的問題是:為兩個表之一中的department_id列建立索引會加快此查詢的速度,還是我必須在兩個表中的兩個department_id列中創建索引才能看到性能的提高?

這兩個表自然已經在department_id上建立了索引,因為這應該是depts主鍵和emps外鍵。

在您的查詢中,雖然不太可能使用索引。 當DBMS最終讀取所有記錄時,為什么DBMS還要掃描索引樹呢? 簡單的順序全表掃描,然后例如進行哈希連接通常通常會快得多。

讓我們看另一個例子:

select e.last_name, d.department_name 
from emps e
join depts d on d.department_id  = e.department_id
where e.first_name = 'Laura';

在這里,我們只對少數員工感興趣。 這就是索引起作用的地方。 我們需要在emps(first_name)上建立索引。 然后,我們將知道員工記錄department_id ,並且可以訪問關聯的dept記錄。

但是說了這一點,我們注意到我們使用索引查找表記錄來查找department_id 從索引中正確獲取department_id會更快嗎? 是的,會的。 因此索引應該在emps(first_name, department_id)

depts主鍵是department_id ,因此此列已建立索引,我們可以輕松找到帶有部門名稱的depts記錄。

但是我們可以再次問同樣的問題:我們也不能從索引中正確獲取名稱嗎? 這使我們覆蓋了包含查詢中使用的所有列的索引。

所以,雖然

index idx_emps on emps(first_name, department_id)
index idx_depts on depts(department_id)

足夠,我們可以使用這些覆蓋索引來使查詢更快:

index idx_emps on emps(first_name, department_id, last_name)
index idx_depts on depts(department_id, department_name)

當數據庫強制執行一致性和完整性時,您應該始終索引pk和fks以減少阻塞和爭用。

我還建議顯式加入,而不是使用USING 那里太多的約定和魔力:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM