2

我正在使用Rails和Postgres。使用STI時索引在哪裏?

我有幾個使用STI的模型,我想知道我應該在表上放置索引,爲什麼?

例如可以說我有以下設置:

class Comment < AR; end 
class MovieComment < Comment; end 
class MagazineComment < Comment; end 


# Fake Comment Table 
id:integer 
title:string 
body:text 
type:string 

謝謝!

回答

7

type字段中,如果您只想要MovieCommentMagazineComment之一。如果你不這樣做,你不需要這裏的索引。我不確定AR是否每次都使用type,但只是爲了確保。

因爲id字段是主鍵,所以索引應該已經存在。

如果您想同時通過typeid進行查詢,請確保您有組合索引。

在其他領域:取決於你查詢什麼,但我想你只想檢索這些。

0

通常,您需要在執行查詢時將使用的列中的索引。

如果你這樣做MovieComment.find(10),數據庫將使用id字段中的索引,Rails會自動爲你添加。如果你這樣做,則相同Comment.find(30):Rails將使用該索引檢索帶有id 30的推薦碼,然後它將讀取type列,它將返回MovieCommentMagazineComment

例如,如果您要添加一個按標題進行搜索的功能,您也必須在該列中創建一個索引。在這種情況下,可能是:全文索引。

type列中的索引將使查詢更快,因爲它等於Comment.where(type: 'MagazineComment').all,但它可能不值得。

+0

你介意更詳細地說明爲什麼不值得索引'type'列嗎? – shinnyx 2017-01-03 04:13:14

+1

索引有助於從數據庫中選擇單個記錄(或一小組記錄)。當你的選擇標準包含大部分表格時(假設20%的評論是「MovieComment」,80%是「MagazineComment」),數據庫可能會決定每次進行全表掃描會更便宜。 http://stackoverflow.com/questions/33911589/mysql-does-not-always-use-index – Daniel 2017-02-15 01:17:38