mysql 索引

一、索引

  索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

                    30
 
        10                        40
 
   5         15            35             66
 
1   6     11    19      21      39     55     100  

MySQL中常见索引有:

  • 普通索引
  • 唯一索引
  • 主键索引
  • 组合索引

二、普通索引

  普通索引仅有一个功能:加速查询  

 1 mysql> desc student;
 2 +---------------+---------------+------+-----+---------+----------------+
 3 | Field         | Type          | Null | Key | Default | Extra          |
 4 +---------------+---------------+------+-----+---------+----------------+
 5 | stu_id        | int(11)       | NO   | PRI | NULL    | auto_increment |
 6 | name          | varchar(50)   | YES  |     | NULL    |                |
 7 | register_date | date          | NO   |     | NULL    |                |
 8 | gender        | enum('M','F') | NO   |     | NULL    |                |
 9 +---------------+---------------+------+-----+---------+----------------+
10 4 rows in set (0.00 sec)
11 
12 mysql> create index student_name on student(name);
13 Query OK, 0 rows affected (0.06 sec)
14 Records: 0  Duplicates: 0  Warnings: 0
创建索引
mysql> mysql> show index from student;
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY      |            1 | stu_id      | A         |           6 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | student_name |            1 | name        | A         |           6 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
查看索引
# 语法
drop index index_name on table_name

mysql> drop index student_name on student;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
删除索引
# 语法
alter table table_name add index index_name (column_list);

mysql> alter table student add index student_name (name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
修改表结构增加索引

  如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

  

 三、唯一索引

  它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式: 

# 创建唯一索引
 CREATE UNIQUE INDEX index_name on table_name(column_name(length))

# 修改表结构创建
ALTER TABLE table_name add INDEX index_name on (column_name(length))

# 创建表的时候指定
CREATE TABLE mytable( 
  
ID INT NOT NULL,  
  
username VARCHAR(16) NOT NULL, 
  
UNIQUE [indexName] (username(length)) 
  
); 

四、主键索引 

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
 
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

  删除主键索引

alter table 表名 drop primary key;
alter table 表名  modify  列名 int, drop primary key;

  

五、组合索引 

  组合索引是将n个列组合成一个索引

create table in3(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text
)

创建表
创建表
create index ix_name_email on in3(name,email);
创建索引
原文地址:https://www.cnblogs.com/bigberg/p/8309285.html