MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
1. 普通索引
2. 唯一性索引
3. 主键索引
4. 单列索引
5. 多列(组合、联合)索引
6. 全文索引
7. 补充:空间索引
小结:不同的存储引擎支持的索引类型也不一样
InnoDB :支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM : 支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory :支持 B-tree、Hash 等 索引,不支持 Full-text 索引;
NDB :支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive :不支 持 B-tree、Hash、Full-text 等索引;
1.创建表的时候创建索引
代码示例:
- CREATE TABLE dept(
- dept_id INT PRIMARY KEY AUTO_INCREMENT,
- dept_name VARCHAR(20)
- );
- CREATE TABLE emp(
- emp_id INT PRIMARY KEY AUTO_INCREMENT,
- emp_name VARCHAR(20) UNIQUE,
- dept_id INT,
- CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
- );
但是,如果显式创建表时创建索引的话,基本语法格式如下:
- CREATE TABLE table_name [col_name data_type]
- [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC |
- DESC]
- UNIQUE 、 FULLTEXT 和 SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
- INDEX 与 KEY 为同义词,两者的作用相同,用来指定创建索引;
- index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
- col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
- length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
- ASC 或 DESC 指定升序或者降序的索引值存储。
在book表中的year_publication字段上建立普通索引,SQL语句如下:
- CREATE TABLE test1(
- id INT NOT NULL,
- name varchar(30) NOT NULL,
- UNIQUE INDEX uk_idx_id(id)
- );
该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:
SHOW INDEX FROM test1 \G
- CREATE TABLE test1(
- id INT NOT NULL,
- name varchar(30) NOT NULL,
- UNIQUE INDEX uk_idx_id(id)
- );
该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:
SHOW INDEX FROM test1 \G
设定为主键后数据库会自动建立索引,innodb为聚簇索引,语法:
随表一起建索引:
- CREATE TABLE student (
- id INT(10) UNSIGNED AUTO_INCREMENT ,
- student_no VARCHAR(200),
- student_name VARCHAR(200),
- PRIMARY KEY(id)
- );
删除主键索引:
- ALTER TABLE student
- drop PRIMARY KEY ;
修改主键索引:必须先删除掉(drop)原索引,再新建(add)索引
- CREATE TABLE test2(
- id INT NOT NULL,
- name CHAR(50) NULL,
- INDEX single_idx_name(name(20))
- );
该语句执行完毕之后,使用SHOW CREATE TABLE查看表结构:
SHOW INDEX FROM test2 \G
举例:创建表test3,在表中的id、name和age字段上建立组合索引,SQL语句如下:
- CREATE TABLE test3(
- id INT(11) NOT NULL,
- name CHAR(30) NOT NULL,
- age INT(11) NOT NULL,
- info VARCHAR(255),
- INDEX multi_idx(id,name,age)
- );
该语句执行完毕之后,使用SHOW INDEX 查看:
SHOW INDEX FROM test3 \G
举例1:创建表test4,在表中的info字段上建立全文索引,SQL语句如下:
- CREATE TABLE test4(
- id INT NOT NULL,
- name CHAR(30) NOT NULL,
- age INT NOT NULL,
- info VARCHAR(255),
- FULLTEXT INDEX futxt_idx_info(info)
- ) ENGINE=MyISAM;
在MySQL5.7及之后版本中可以不指定最后的ENGINE了,因为在此版本中InnoDB支持全文索引。
举例2:
- CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- title VARCHAR (200),
- body TEXT,
- FULLTEXT index (title, body)
- ) ENGINE = INNODB ;
创建了一个给title和body字段添加全文索引的表。
- CREATE TABLE `papers` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `title` varchar(200) DEFAULT NULL,
- `content` text,
- PRIMARY KEY (`id`),
- FULLTEXT KEY `title` (`title`,`content`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
不同于like方式的的查询:
SELECT * FROM papers WHERE content LIKE ‘%查询字符串%’;
全文索引用match+against方式查询:
SELECT * FROM papers WHERE MATCH(title,content) AGAINST (‘查询字符串’);
注意点 :
1. 使用全文索引前,搞清楚版本支持情况;
2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引。
空间索引创建中,要求空间类型的字段必须为 非空 。
举例:创建表test5,在空间类型为GEOMETRY的字段上创建空间索引,SQL语句如下:
- CREATE TABLE test5(
- geo GEOMETRY NOT NULL,
- SPATIAL INDEX spa_idx_geo(geo)
- ) ENGINE=MyISAM;
2.在已经存在的表上创建索引
在已经存在的表中创建索引可以使用ALTER TABLE语句或者CREATE INDEX语句。
- ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
- [index_name] (col_name[length],...) [ASC | DESC]
- CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
- ON table_name (col_name[length],...) [ASC | DESC]
ALTER TABLE table_name DROP INDEX index_name;
DROP INDEX index_name ON table_name;
提示 删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成 索引的所有列都被删除,则整个索引将被删除。