2009-02-18 42 views
37

什麼是索引關鍵字的意思和它提供了什麼功能?我知道這是爲了加快查詢的速度,但我不確定如何做到這一點。MYSQL:索引關鍵字在創建表和何時使用它

當如何選擇要索引的列?

索引使用的樣品如下所示在創建表查詢:

CREATE TABLE `blog_comment` 
(
    `id` INTEGER NOT NULL AUTO_INCREMENT, 
    `blog_post_id` INTEGER, 
    `author` VARCHAR(255), 
    `email` VARCHAR(255), 
    `body` TEXT, 
    `created_at` DATETIME, 
    PRIMARY KEY (`id`), 
    INDEX `blog_comment_FI_1` (`blog_post_id`), 
    CONSTRAINT `blog_comment_FK_1` 
     FOREIGN KEY (`blog_post_id`) 
     REFERENCES `blog_post` (`id`) 
)Type=MyISAM 

;

回答

32

我建議您從MySQL Reference Manual讀取How MySQL Uses Indexes。它指出使用索引...

  • 快速找到匹配WHERE子句的行。
  • 消除考慮的行。
  • 在執行連接時從其他表中檢索行。
  • 查找特定索引列的值MIN()MAX()
  • 對錶格進行排序或分組(在特定條件下)。
  • 在不查詢數據行的情況下優化僅使用索引的查詢。

數據庫中的索引像書中的索引一樣工作。您可以更快地找到您要查找的內容,因爲索引是按字母順序列出的。 MySQL使用B-trees來組織它的索引,而不是按字母順序排列的列表,這對於其目的來說更快(但對於人來說需要更長的時間)。

使用更多的索引意味着使用更多的空間(以及維護索引的開銷),所以只有在滿足上述使用條件的列上使用索引纔是非常值得的。

在您的示例中,idblog_post_id列都使用索引(PRIMARY KEY也是索引),以便應用程序可以更快地找到它們。在id的情況下,這很可能允許用戶快速修改或刪除評論,並且在blog_post_id的情況下,應用程序可以快速查找給定帖子的所有評論。

您會注意到email列沒有索引。這意味着通過特定的電子郵件地址搜索所有博客文章可能需要相當長的時間。如果搜索某個特定電子郵件地址的所有評論是您想要添加的內容,那麼也可以添加一個索引。

4

此關鍵字意味着您要在表blog_post_id上創建索引。

查詢這樣的:

SELECT * 
FROM blog_comment 
WHERE blog_post_id = @id 

將使用該索引中查找在這一領域,運行速度更快。

此外,此列上還有一個foreign key

當您決定刪除博客文章時,數據庫將需要對照此表進行檢查,以查看是否沒有孤兒評論。該指數也將加快此檢查,所以像

DELETE 
FROM blog_post 
WHERE ... 

也會運行得更快。