MYSQL:create table中的Index关键字以及何时使用它

时间:2009-02-18 15:16:10

标签: mysql

index关键字的含义是什么以及它所服务的功能是什么?我知道这是为了加快查询速度,但我不确定如何做到这一点。

何时选择要编制索引的列?

index关键字使用情况的示例如下所示create table查询:

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

2 个答案:

答案 0 :(得分:40)

我建议您从How MySQL Uses Indexes阅读MySQL Reference Manual。它声明使用了索引......

  • 快速查找与WHERE子句匹配的行。
  • 排除考虑的行。
  • 在执行连接时从其他表中检索行。
  • 查找特定索引列的MIN()MAX()值。
  • 对表格进行排序或分组(在某些条件下)。
  • 在不咨询数据行的情况下,仅使用索引优化查询。

数据库中的索引就像书中的索引一样。您可以更快地在书中找到所需内容,因为索引按字母顺序列出。 MySQL不是使用按字母顺序排列的列表,而是使用B-trees来组织索引,这样可以更快地实现其目的(但对人类来说需要更长的时间)。

使用更多索引意味着占用更多空间(以及维护索引的开销),因此只有在符合上述使用标准的列上使用索引才真正值得。

在您的示例中,idblog_post_id列都使用索引(PRIMARY KEY也是索引),以便应用程序可以更快地找到它们。在id的情况下,这可能允许用户快速修改或删除评论,并且在blog_post_id的情况下,应用程序可以快速查找给定帖子的所有评论。 / p>

您会注意到email列没有索引。这意味着通过特定的电子邮件地址搜索所有博客帖子可能需要相当长的时间。如果您想要添加特定电子邮件地址的所有评论,那么添加索引也是有意义的。

答案 1 :(得分:4)

此关键字表示您要在列blog_post_id上创建索引以及表。

这样的查询:

SELECT *
FROM blog_comment
WHERE blog_post_id = @id

将使用此索引搜索此字段并运行得更快。

此列上还有foreign key

当您决定删除博客帖子时,数据库将需要检查此表以查看没有孤立评论。该索引还将加快此检查,因此查询如

DELETE
FROM blog_post
WHERE ...

也会跑得更快。

相关问题