MySql教程

MySQL索引

本文主要是介绍MySQL索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 简介

MySQL 支持如下索引:

  • index/key:普通索引;
  • primary key:(1)值必须唯一,且所有的关键列都必须被定义为 not null,如果用户没有显式地定义,MySQL 会隐私地声明;(2)一张表只能包含一个 primary key;(3)primary key 对应索引的名称为 primary,对于其它类型的索引,如果没有显式地赋予一个名字,则默认为第一个索引列的名称,可能还会添加 _2_3 等后缀,以保持唯一性;
  • unique:值必须唯一,但可以为 NULL
  • fulltext:(1)用于全文搜索,只有 InnoDB 和 MyISAM 存储引擎支持;(2)只能用于 char, varchar, text 数据类型;(3)索引时使用的是该列的全部内容,不支持列前缀,即使用全文,而不是值的前缀;
  • spatial:只能用于空间类型,只有 InnoDB 和 MyISAM 存储引擎支持;

2. 列前缀

对于字符串类型,创建索引时可以通过 column_name(length) 来指定只使用该列的 [ 0 , l e n g t h ) [0, length) [0,length) 部分。

对于 blobtext 数据类型,则是必须指定列前缀。

对于非二进制字符串类型(charvarchartext)前缀长度以字符为单位;对于二进制字符串类型(binaryvarbinaryblob)前缀长度以字节为单位。

3. 添加索引

在创建索引时,可以通过 using btreeusing hash 来指定索引类型:

  • InnoDB 和 MyISAM 存储引擎支持 BTREE 索引;
  • Memory 存储引擎支持 HASH 和 BTREE 索引;

此外,也可以创建多列索引:

{index | unique | fulltext | spatial | primary key} [index_type] (key_part,...)

index_type: using {btree| hash}
key_part: column_name[(length)] [ASC | DESC]

注:fulltextspatial 索引不能使用 index_type

创建表的同时添加索引:

create table `lookup`
(
    `id` int,
    `first_name` varchar(20),
    `second_name` varchar(20),
    index using btree(`first_name`(10), `second_name`(10))
) engine=Memory;

创建表之后添加:create [unique | fulltext | spatial] index ...

# 索引名为 first_name
MariaDB [mydb]> create index `first_name` using btree on `lookup` (`first_name`(10), `second_name`(10));
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

或者:alter table table_name add {index | unique | fulltext | spatial | primary key} ...

MariaDB [mydb]> alter table `lookup` add index using btree(`first_name`(10), `second_name`(10));
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

4. 查看索引

MariaDB [mydb]> show index from `lookup` \G
*************************** 1. row ***************************
        Table: lookup
   Non_unique: 1
     Key_name: first_name
 Seq_in_index: 1
  Column_name: first_name
    Collation: A
  Cardinality: NULL
     Sub_part: 10
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: lookup
   Non_unique: 1
     Key_name: first_name
 Seq_in_index: 2
  Column_name: second_name
    Collation: A
  Cardinality: NULL
     Sub_part: 10
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
2 rows in set (0.00 sec)

5. 删除索引

MariaDB [mydb]> drop index `first_name` on `lookup`;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

或者:

MariaDB [mydb]> alter table `lookup` drop index `first_name`;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除主键时使用:

alter table `table_name` drop primary key;
这篇关于MySQL索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!