index关键字是什么意思?它有什么功能?我理解这是为了加快查询速度,但我不太确定如何做到这一点.

何时 Select 要编制索引的列?

下面的create table查询中显示了index个关键字的用法示例:

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

;

推荐答案

我建议你读MySQL Reference Manual中的How MySQL Uses Indexes.它说明使用了索引...

  • 快速查找与WHERE子句匹配的行.
  • 不考虑行.
  • 在执行联接时从其他表检索行.
  • 查找特定索引列的MIN()MAX()值.
  • (在某些条件下)对一张表进行排序或分组.
  • 只使用索引而不查看数据行来优化查询.

数据库中的索引就像书中的索引一样工作.你可以更快地在书中找到你想要的东西,因为索引是按字母顺序排列的.MySQL使用B-trees来组织索引,而不是按字母顺序排列的列表,这对于其目的来说更快(但对于人类来说需要更长的时间).

使用更多的索引意味着占用更多的空间(以及维护索引的开销),因此,在满足上述使用标准的列上使用索引才是真正值得的.

在您的示例中,idblog_post_id列都使用索引(PRIMARY KEY也是索引),因此应用程序可以更快地找到它们.在id的情况下,这可能允许用户快速修改或删除 comments ,在blog_post_id的情况下,应用程序可以快速找到给定帖子的所有 comments .

您会注意到email列没有索引.这意味着按特定邮箱地址搜索所有博客帖子可能需要相当长的时间.如果您希望添加按特定邮箱地址搜索所有 comments 的内容,那么也可以添加索引.

Mysql相关问答推荐

对象NotExecutabletry 在远程SQL服务器上执行SQL时出错,并使用SQLAchemy.Create_engine

MySQL INSERT INSERT ON DIPLICATE KEY UPDATE WITH COMPAY PRIMARY KEY失败

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

LaravelEloquent ToSql()缺少连接表

使用JSON_CONTAINS搜索多个值的原理

为什么我的带有索引字段和非索引字段的 Select 有时需要很长时间

比较2个mysql json数据类型列

如何创建一个列,该列在另一个表中具有值的计数?

java.lang.NullPointerException:无法调用com.proj.my.repository.OrderRepository.save(Object),因为this.orderRepository为空

使用 SET 变量进行 MySQL 查询

从 2 个不同的表中获取数据并将它们加入 sql

Golang Gorm 没有创建带有约束的表

基于两个单元格值的 SQL 过滤表

如何使用 laravel 连接 mysql?

MySQL - 如何 Select 值在数组中的行?

PHP 判断 NULL

在mysql中增量更新值

MySQL 实用程序 - ~/.my.cnf 选项文件

在 MySQL 中的子查询上使用 GROUP_CONCAT

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源