2014-09-28 463 views
1

2表:在其列,我應該創建索引

countries: 
    id 
    short_name ("GE", "AR"...) 
    long_name 
    .... 

banks: 
    id 
    name ("NATIONAL BANK OF COUNTRY123"...) 
    country_id 
    ... 

鑑於大多數時候,我會做以下類型的查找:

select * from countries c 
inner join banks b 
on b.country_id = c.id 
where c.short_name = ? and b.name = ? 

什麼列,我應該創建索引?我想在countries我應該創建一個額外的索引short_nameid將保持爲主要的自動遞增鍵)。我不知道banks,如果我在name這是一個varchar字符串創建一個索引,它會高效和明智嗎?

回答

-1

添加指數在其上的數字像整數,雙它們在where子句中,可以有索引的數據類型......還有那些列的列...

+0

避免添加未使用的索引,因爲它們什麼都不做,只會減慢更新/插入。多加1或2不會使人虛弱,但如果你達到10或20,這將是非常明顯的,並且精確地指出它們中的哪些是必要的,這可能是耗時的。 – Ramfjord 2014-09-29 02:41:40

2

如果這是您的查詢:

select * 
from countries c inner join 
    banks b 
    on b.country_id = c.id 
where c.short_name = ? and b.name = ?; 

您有兩種索引方法。基本思想是SQL引擎將從一個表(掃描)中查找行,然後在另一個表中查找值。

第一種可能性是 「掃描」 countries,然後在banks查找:

countries(name, id) 
banks(country_id, short_name) 

第二種可能性是 「掃描」 banks,然後查找在`國家:

banks(short_name, country_id) 
countries(id, name) 

這實際上是更好取決於數據中值的分佈。您實際上可以添加這兩個集合並讓SQL引擎決定。

+0

拿國家表。我可以添加哪些索引:1)id和name 2)name_id(id和name_id)3)id和id_name? – 2014-09-28 11:44:44

+0

@Grienders。 。 。 'country_id,id'和/或'id,name'。 – 2014-09-28 11:48:12

+0

2列不同的索引或1索引? – 2014-09-28 15:54:37

1

對於countries表箱索引short_name。像(id, short_name)這樣的組合索引是浪費資源 - 爲什麼:id是主鍵 - 唯一的,所以通過第一個組件(id)查找已經給出了一行,從第二個組件獲益?我認爲short_name也是獨一無二的,所以(short_name, id)也是如此。

其他與banks表的情況。 country_id在這裏並不是唯一的,所以你可以從索引中受益:(country_id, name)

我認爲這兩個額外的索引足以滿足你的查詢要求。

+0

但銀行中的「名稱」可能很長,如「共和國金剛國家銀行」。你確定在它上面創建一個索引是明智的嗎? – 2014-09-29 03:45:46

+0

沒有'name'上的索引,但是使用'banks(country_id)'''將掃描'name'的行數與全國各地的銀行數量相同。如果一個國家的銀行數量不重要(比如說10),那麼你可以使用銀行指數'country(country_id)'。我建議測試 - 如果這個索引的搜索速度不適合你的需要,那麼創建索引'banks(country_id,name)' – Rimas 2014-09-29 06:17:56

+0

Rimas,你不明白。這是一個簡單的「是 - 否」的問題。 ---「,但銀行的」名稱「可能很長,像」金剛共和國國家銀行「。你確定建立一個索引是明智的嗎?」 – 2014-09-29 08:43:40

1

找出需要的索引的最佳方法是測試它們。我希望你有一個爲此設置的開發環境,你可以加載生產數據(pg_dump和pg_restore)。

如果您的表格足夠小,根本沒有任何幫助。例如,您的國家/地區表(假設它是一個國家/地區列表)可能不需要任何索引。

如果你總是在查詢銀行名稱,銀行表有> 10K記載,banks(name)指數會有所幫助。如果你想得到一個國家的銀行名單,但是,索引banks(country_id)也會很好。

如果您真的關心您的查詢性能,請從沒有索引開始,並測試每個索引以找出它帶來的好處。PostgreSQL的解釋分析工具非常好,但是使用explain.depesz.com會爲您計算出每個組件需要多長時間才能獲得額外的數學計算。

+0

1)如何測試他們是否需要索引? 2)銀行的「名稱」是長度約爲30個符號的varchar。在它上面創建一個索引是否明智?這不會損害表現嗎? – 2014-09-29 08:46:27

+1

根據經驗,我不擔心varchar(30)字段太大而無法索引 - 我從來沒有遇到任何問題。此外,我建議只使用文本,除非你明確地想要截斷名稱長度。 [性能差異可以忽略不計。](http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/)測試這個東西:1)負載生產模式/數據到pg_dump/restore的開發數據庫中。 2)使用EXPLAIN ANALYZE測試示例查詢。 3)嘗試用你認爲會加快步驟2中查詢速度慢的部分的索引。4)重複2和3直到滿意。 – Ramfjord 2014-09-29 23:02:11

相關問題