2011-12-16 31 views
1

所以我有一個很大的表,我查詢(只選擇)相當頻繁。該表大約有12,000行。自iOS出現以來,運行這些select查詢的時間增加了4-5倍。我有一個需要優化的巨大表格。我認爲我需要使用索引,但我希望獲得更多有關它們的信息

有人告訴我需要爲我的表添加索引。我正在使用的查詢如下所示:

SELECT * FROM book_content WHERE book_id = ? AND chapter = ? ORDER BY verse ASC 

如何爲此表創建索引?這是我剛運行一次的命令嗎?索引究竟做什麼?我沒有在學校學到這些東西,所以他們現在對我來說似乎仍然有點神奇,所以我希望能得到一點教訓。

謝謝!

回答

4

你想要一個關於book_id和章節的索引。如果沒有索引,服務器會執行table scan,並將整個表加載到內存中以進行搜索。快速搜索您正在使用的RDBMS的CREATE INDEX命令。每創建INSERTDELETEUPDATE時,您都會創建索引,服務器將自動更新索引。索引可以是UNIQUE,它可以在多個字段上(在你的案例中,book_id和chapter)。如果你使它成爲UNIQUE,數據庫將不允許你插入第二行使用相同的密鑰(在本例中爲book_id和chapter)。在大多數服務器上,兩個字段上有一個索引不同於每個字段上有兩個單獨索引。

MySQL的例子是:

CREATE INDEX id_chapter_idx ON book_content (book_id,chapter); 

如果你想爲每個book_id只有一條記錄,章組合,使用這個命令:

CREATE UNIQUE INDEX id_chapter_idx ON book_content (book_id,chapter); 

一個PRIMARY INDEXUNIQUE一個特殊的索引和NOT NULL。每個表只能有一個主索引。實際上,每個表應該有一個主索引來確保表的完整性,特別是在連接期間。

+0

+1瞭解詳情 – 2011-12-16 02:10:00

+1

我的所有表的首選方法是首先創建一個字段「ID」,它是主鍵,並具有關於身份的規範。這意味着它會自動在每個新記錄上創建一個唯一的編號。身份已打開,您無法設置ID。但是,如果主鍵上的標識關閉,那麼標識字段將允許您設置標識,只是您不能複製標識或將其留空。我知道ID字段將有自己的自動索引,如果我有另一個常用的字段,那麼我在該字段上創建一個。但不超過3個字段。 – 2011-12-16 02:48:17

1

索引是一個非常敏感的主題。如果你考慮使用它們,你需要非常小心你做了多少。每個表的主鍵或id應該有一個聚集索引。其餘的,這取決於你打算如何使用它們。我對索引主題非常模糊,實際上從來沒有和他們合作過,但是從我昨天剛剛觀看的研討會中,你不需要太多索引 - 因爲當你不需要索引時,它們實際上可以減慢速度需要使用它們。

假設你在表格上的8個字段中的5個上放置索引。每個索引都被指定用於軟件某處的特定查詢。那麼,當1個查詢運行時,它使用那個1索引,並且不需要另外4個。所以這對於這個1查詢是不必要的權重。如果你需要一個索引,確保這是一個索引,可以在許多地方使用,而不僅僅是一個地方。

+0

PS我知道這不一定回答你的問題,但知道你是否想要實現索引是非常重要的信息。 – 2011-12-16 01:28:48

+1

一個好的指數也會有很多值(這就是所謂的'選擇性');如果我們正在討論人事數據庫表,那麼索引這個人的性別沒有意義,因爲只有兩個值。一個好的指數具有低選擇性。 – 2011-12-18 13:45:37

2

您不必將索引視爲「魔術」。

SQL表上的索引與印刷書籍中的索引非常相似 - 它可讓您在不閱讀整本書封面封面的情況下找到要查找的內容。

例如,假設您有食譜,並且您正在尋找涉及雞肉的食譜。本書後面的索引可能會這樣說:

chicken: 30,34,72,84 

讓你知道你會在這4頁上找到雞肉食譜。在索引中查找這些信息要比閱讀整本書要快得多,因爲索引較短,(更重要的)是按字母順序排列,因此您可以在索引中快速找到合適的位置。

因此,一般來說,您希望在您經常需要查詢的列(book_id和chapter,在您的示例中)上創建索引。

2

當您聲明一個列作爲主鍵時,會自動在該列上生成一個索引。在你的情況下,更經常地選擇索引是理想的,因爲它們可以縮短選擇查詢的時間並降低插入的時間。因此,您可以創建您認爲需要的索引而不必擔心性能

相關問題