12月阅读周·MySQL数据库入门:创建表的时候创建索引篇

举报
叶一一 发表于 2024/12/25 09:32:15 2024/12/25
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十一个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十一个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码

当前阅读周书籍MySQL数据库入门

创建表的时候创建索引

创建表的时候可以直接创建索引,这种方式最简单、方便,其基本的语法格式如下所示:

CREATE TABLE 表名(字段名 数据类型[完整性约束条件],
                  字段名 数据类型[完整性约束条件],
                  …
                      字段名 数据类型
                      [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY
                          [别名] (字段名1 [(长度)]) [ASC|DESC])
                  );

关于上述语法的相关解释具体如下。

(1)UNIQUE:可选参数,表示唯一索引。

(2)FULLTEXT:可选参数,表示全文索引。

(3)SPATIAL:可选参数,表示空间索引。

(4)INDEX和KEY:用来表示字段的索引,二者选一即可。

(5)别名:可选参数,表示创建的索引的名称。

(6)字段名1:指定索引对应字段的名称。

(7)长度:可选参数,用于表示索引的长度。

(8)ASC和DESC:可选参数,其中,ASC表示升序排列,DESC表示降序排列。

为了帮助读者更好地了解如何在创建表的时候创建索引,接下来,通过具体的案例,分别对MySQL中的6种索引类型进行讲解,具体如下:

创建普通索引

【例1-1】 在t1表中id字段上建立索引,SQL语句如下:

CREATE TABLE t1(id INT,
                name VARCHAR(20),
                score FLOAT,
                INDEX (id)
               );

上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:

mysql>SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
      Table: t1
Create Table: CREATE TABLE 't1' (
  'id' int(11) DEFAULT NULL,
  'name' varchar(20) COLLATE utf8_bin DEFAULT NULL,
  'score' float DEFAULT NULL,
  KEY 'id' ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,id字段上已经创建了一个名称为id的索引。为了查看索引是否被使用,可以使用EXPLAIN语句进行查看,SQL代码如下:

EXPLAIN SELECT * FROM t1 WHERE id=1 \G

执行结果如下所示:

mysql>EXPLAIN SELECT * FROM t1 WHERE id=1 \G
*************************** 1. row ***************************
          id: 1
  select_type: SIMPLE
      table: t1
         type: ref
possible_keys: id
      key: id
    key_len: 5
      ref: const
      rows: 1
    Extra: Using where
1 row in set (0.03 sec)

从上述执行结果可以看出,possible_keys和key的值都为id,说明id索引已经存在,并且已经开始被使用了。

创建唯一性索引

【例1-2】 创建一个表名为t2的表,在表中的id字段上建立索引名为unique_id的唯一性索引,并且按照升序排列,SQL语句如下:

CREATE TABLE t2(id INT NOT NULL,
                name VARCHAR(20) NOT NULL,
                score FLOAT,
                UNIQUE INDEX unique_id(id ASC)
               );

上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:

mysql>SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
        Table: t2
Create Table: CREATE TABLE 't2' (
  'id' int(11) NOT NULL,
  'name' varchar(20) COLLATE utf8_bin NOT NULL,
'score' float DEFAULT NULL,
  UNIQUE KEY 'unique_id' ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,id字段上已经建立了一个名称为unique_id的唯一性索引。

创建全文索引

【例1-3】 创建一个表名为t3的表,在表中的name字段上建立索引名为fulltext_name的全文索引,SQL语句如下:

CREATE TABLE t3(id INT NOT NULL,
                name VARCHAR(20) NOT NULL,
                score FLOAT,
                FULLTEXT INDEX fulltext_name(name)
                )ENGINE=MyISAM;

上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:

mysql>SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
        Table: t3
Create Table: CREATE TABLE 't3' (
  'id' int(11) NOT NULL,
  'name' varchar(20) COLLATE utf8_bin NOT NULL,
  'score' float DEFAULT NULL,
  FULLTEXT KEY 'fulltext_name' ('name')
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,name字段上已经建立了一个名为fulltext_name的全文索引。需要注意的是,由于目前只有MyISAM存储引擎支持全文索引,InnoDB存储引擎还不支持全文索引,因此,在建立全文索引时,一定要注意表存储引擎的类型,对于经常需要索引的字符串、文字数据等信息,可以考虑存储到MyISAM存储引擎的表中。

创建单列索引

【例1-4】 创建一个表名为t4的表,在表中的name字段上建立索引名为single_name的单列索引, SQL语句如下:

CREATE TABLE t4(id INT NOT NULL,
                name VARCHAR(20) NOT NULL,
                score FLOAT,
                INDEX single_name(name(20))
                );

上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:

mysql>SHOW CREATE TABLE t4\G
*************************** 1. row ***************************
        Table: t4
Create Table: CREATE TABLE 't4' (
  'id' int(11) NOT NULL,
  'name' varchar(20) COLLATE utf8_bin NOT NULL,
  'score' float DEFAULT NULL,
  KEY 'single_name' ('name')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,name字段上已经建立了一个名称为single_name的单列索引,并且索引的长度为20。

创建多列索引

【例1-5】 创建一个表名为t5的表,在表中的id和name字段上建立索引名为multi的多列索引,SQL语句如下:

CREATE TABLE t5(id INT NOT NULL,
                name VARCHAR(20) NOT NULL,
                score FLOAT,
                INDEX multi(id,name(20))
                );

上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:

mysql>SHOW CREATE TABLE t5\G
*************************** 1. row ***************************
        Table: t5
Create Table: CREATE TABLE 't5' (
  'id' int(11) NOT NULL,
  'name' varchar(20) COLLATE utf8_bin NOT NULL,
  'score' float DEFAULT NULL,
  KEY 'multi' ('id','name')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,id和name字段上已经建立了一个名为multi的多列索引。需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,多列索引才会被使用。为了验证这个说法是否正确,将id字段作为查询条件,通过EXPLAIN语句查看索引的使用情况,SQL执行结果如下所示:

mysql>EXPLAIN SELECT * FROM t5 WHERE id=1 \G
*************************** 1. row ***************************
          id: 1
  select_type: SIMPLE
      table: t5
           type: ref
possible_keys: multi
          key: multi
    key_len: 4
          ref: const
        rows: 1
      Extra:
1 row in set (0.09 sec)

从上述执行结果可以看出,possible_keys和key的值都为multi,说明multi索引已经存在,并且已经开始被使用了。但是,如果只使用name字段作为查询条件,SQL执行结果如下所示:

mysql>EXPLAIN SELECT * FROM t5 WHERE name='Mike' \G
*************************** 1. row ***************************
          id: 1
  select_type: SIMPLE
        table: t5
           type: ALL
possible_keys: NULL
          key: NULL
    key_len: NULL
          ref: NULL
        rows: 1
      Extra: Using where
1 row in set (0.01 sec)

从上述执行结果可以看出,possible_keys和key的值都为NULL,说明multi索引还没有被使用。

创建空间索引

【例1-6】 创建一个表名为t6的表,在空间类型为GEOMETRY的字段上创建空间索引,SQL语句如下:

CREATE TABLE t6(id INT,
                space GEOMETRY NOT NULL,
                SPATIAL INDEX sp(space)
                )ENGINE=MyISAM;
上述SQL语句执行后,使用SHOW CREATE TABLE语句查看表的结构,结果如下所示:mysql>SHOW CREATE TABLE t6\G
*************************** 1. row ***************************
        Table: t6
Create Table: CREATE TABLE 't6' (
  'id' int(11) DEFAULT NULL,
  'space' geometry NOT NULL,
  SPATIAL KEY 'sp' ('space')
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

从上述结果可以看出,t6表中的space字段上已经建立了一个名称为sp的空间索引。需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM。

总结

创建表的时候可以直接创建索引,这种方式最简单、方便。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。