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);