MySQL 索引(八)

索引

  • 索引用于快速找出某列中有一特定值的行。如果表中查询的列有一个索引,MySQL 能快速到达某个位置去搜寻数据文件,而不必查看所有数据。

索引简介

  • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度

索引的含义

  • 索引是在存储引擎中实现的,每种存储引擎的索引都不一定完全相同。所有存储引擎支持每个表至少 16 个索引,总索引长度至少 256 字节。MySQL 中索引的存储类型有两种:BTREEHASH,具体和表的存储引擎相关;MyISAMInnoDB 存储引擎只支持 BTREE 索引;MEMORY/HEAP 存储引擎可以支持 HASHBTREE 索引。

索引的分类

  • MySQL 的索引可以分为以下几类:

    • 普通索引和唯一索引

      普通索引是 MySQL 中的基本索引类型,允许在定义索引的列中插入重复值空值

      唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值

    • 单列索引和组合索引

      单列索引即一个索引只包含单个列,一个表可以有多个单列索引。

      组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合

    • 全文索引

      全文索引类型为 FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值空值。全文索引可以在 CHARVARCHAR 或者 TEXT 类型的列上创建。MySQL 中只有 MyISAM 存储引擎支持全文索引。

    • 空间索引

      空间索引是对空间数据类型的字段建立的索引,MySQL 中的空间数据类型有 4 种,分别是 GEOMETRYPOINTLINESTRINGPOLYGON。MySQL 使用 SPATIAL 关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。

创建索引

  • MySQL 支持多种方法在单个或多个列上创建索引;在创建表的定义语句 CREATE TABLE 中指定索引列,使用 ALTER TABLE 语句在存在表上创建索引,或者使用 CREATE INDEX 语句在已存在的表上添加索引。

创建表的时候创建索引

  • 创建表时创建索引的基本语法格式如下:

    CREATE TABLE table_name [column_name data_type]
    [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC | DESC]
    

    UNIQUEFULLTEXTSPATIAL 为可选参数,分别表示唯一索引全文索引空间索引

    INDEXKEY 为同义词,两者作用相同,用来指定创建索引

    index_name 指定索引的名称,为可选参数,如果不指定,MySQL 默认用 col_name 为索引值;

    length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;

    ASCDESC 指定升序或者降序的索引值存储

  • 使用 EXPLAIN 语句查看索引是否正在使用:

    EXPLAIN SELECT * FROM 表明 WHERE 索引列+匹配条件\G
    

    EXPLAIN 语句输出结果的各行解释如下:

    • select_type 行指定所使用的 SELECT 查询类型。取值有 SIMPLEPRIMARYUNIONSUBQUERY 等。
    • table 行指定数据库读取的数据表的名字,它们按被读取的先后顺序排列。
    • type 行指定了本数据表与其他数据表之间的关联关系,可能的取值有 systemconsteq_refrefrangeindexALL
    • possible_keys 行给出了 MySQL 在搜索数据记录时可选用的各个索引。
    • key 行是 MySQL 实际选用的索引。
    • key_len 给出索引按字节计算的长度,key_len 数值越小,表示越快。
    • ref 行给出了关联关系中另一个数据表里数据列的名字。
    • rows 行是 MySQL 在执行这个查询时预计会从这个数据表里读出的数据行的个数
    • extra 行提供了与关联操作有关的信息。
  • 组合索引可起几个索引的作用,但是使用时并不是随便查询哪个字段都可以使用索引,而是遵从“最左前缀”。如果列不构成索引最左面的前缀,MySQL 不能使用局部索引,如在组合索引 INDEX(a,b,c) 使用(b,c)组合则不能使用索引查询。

  • 创建空间索引

    • 空间索引必须在 MyISAM 类型的表中创建,且空间类型的字段必须为非空,具体语法格式如下:

      CREATE TABLE table_name
      (
      	g GEOMETRY NOT NULL,
          SPATIAL INDEX 索引名(g)
      )ENGINE = MyISAM;
      

在已经存在的表上创建索引

  • 在已经存在的表中创建索引,可以使用 ALTER TABLE 语句或者 CREATE INDEX 语句。
  1. 使用 ALTER TABLE 语句创建索引

    ALTER TABLE 创建索引的基本语法如下:

    ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]
    [index_name] (col_name[length],...) [ASC|DESC]
    

    添加索引前,使用 SHOW INDEX 语句查看指定表中创建的索引:

    SHOW INDEX FROM table_name\G
    

    其中,各个主要参数的含义为:

    • Table 表示创建索引的表。
    • Non_unique 表示索引非唯一,1 代表非唯一索引,0 代表唯一索引
    • Key_name 表示索引的名称。
    • Seq_in_index 表示该字段在索引中的位置,单列索引该值为 1,组合索引为每个字段在索引定义中的顺序。
    • Column_name 表示定义索引的列字段。
    • Sub_part 表示索引的长度。
    • Null 表示该字段是否能为空值。
    • Index_type 表示索引类型。
  2. 使用 CREATE INDEX 创建索引

    CREATE INDEX 语句可以在已经存在的表上添加索引,MySQL 中 CREATE INDEX 被映射到一个 ALTER TABLE 语句上,基本语法结构为:

    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    ON table_name (col_name[length],...) [ASC| DESC]
    

删除索引

  • MySQL 中删除索引使用 ALTER TABLE 或者 DROP INDEX 语句,两者可实现相同的功能,DROP INDEX 语句在内部被映射到一个 ALTER TABLE 语句中。
  1. 使用 ALTER TABLE 删除索引

    ALTER TABLE 删除索引的基本语法格式如下:

    ALTER TABLE table_name DROP INDEX index_name;
    

    提示:添加 AUTO_INCREMENT 约束字段的唯一索引不能被删除。

  2. 使用 DROP INDEX 语句删除索引

    DROP INDEX 删除索引的基本语法格式如下:

    DROP INDEX index_name ON table_name;
    

    提示:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,那么整个索引将被删除。

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    684 引用 • 535 回帖
  • 索引
    24 引用 • 28 回帖
  • 创建索引
    1 引用
  • 删除索引
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...