mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引.
单列索引:一个索引只包含一个列,一个表可以有多个单列索引.
组合索引:一个组合索引包含两个或两个以上的列,
表结构如下:
user CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试用户信息表';
一、单列索引(只有一个字段)
增加索引:
1. 主键索引 :(建立的规则是 int优于varchar,一般在建表的时候创建,一个表只能有一个主键)
//语法如下:
alter table 表名 add primary key 索引名(字段名);
//demo如下:
alter table user add primary key id(id);
primary主键,如果插入值有重复会报类似错误:Duplicate entry '4' for key 'PRIMARY'
2. 唯一索引 :(字段值可以为NULL,但必须唯一)
//语法如下:
create unique index 索引名 on 表名(字段名);//第一种写法
alter table 表名 add unique index 索引名(字段名); //第二种写法
//demo如下:
create unique index index_username on user(username);
alter table user add unique index index_username(username);
unique唯一,如果插入值有重复会报类似错误:Duplicate entry 'username' for key 'index_username'
3. 普通索引 :
//语法如下:
create index 索引名 on 表名(字段名);//第一种写法
alter table 表名 add index 索引名(字段名); //第二种写法
//demo如下:
create index index_username on user(username);
alter table user add index index_username(username);
4. 全文索引:(InnoDB不支持,MyISAM支持性能比较好,一般在 CHAR、VARCHAR 或 TEXT 列上创建。)
//语法如下:
alter table 表名 add fulltext (索引名:不填默认字段名)(字段名);
//demo如下:
alter table user add fulltext (test)(`desc`);
二、组合索引:(多个字段)
//语法如下:
create index 索引名 on 表名(字段名,字段名,... );
//demo如下:
create index index_u_e_m on user(username,email,token);
查看索引:
//语法如下:
show index from 表名;
//demo如下:
show index from user;
Paste_Image.png
删除索引:
//语法如下:
alter table `库名`.`表名` drop index `索引名`;
//demo如下:
alter table `1234567890`.`user` drop index `index_email`; //第一种写法
drop index index_email ON `user` ; //第二种写法
like 模糊查询使用索引 demo:
explain select * from user where username like 'a%';
explain select * from user where username like '%a';
like ‘a%’ 会用到 索引:
Paste_Image.png Paste_Image.png- like语句的 如果你对字段建立了一个索引.当查询的时候的语句是 lick '%ABC%' 那么这个索引讲不会起到作用.而lick 'ABC%' 那么将可以用到索引!
- 索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串!
- 不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描!
- 当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系!
网友评论