# 为表的字段创建和删除索引
> 无论建立主键索引还是普通索引,都要在表的对应列上创建,可以对单列创建索引,也可以对多列创建索引。
### 创建和删除主键索引
查询数据库,按主键查询速度最快的,每个表只能有一个主键列,但是可以有多个普通索引列。主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一。
1. 在建表的时候指定(如上述典型建表语句)
2. 建表后通过alter命令增加、删除主键索引
```
mysql> alter table app_member change uid uid int primary key auto_increment not null ;
mysql> alter table app_member drop primary key;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
```
## 普通索引的建立
1. 在建表时可以指定建立普通索引
2. 使用alter命令新增或者删除普通索引
```
mysql> alter table app_member add key qq(qq);
mysql> alter table app_member drop key qq;
# 或者使用drop方式删除索引
mysql> drop index nickname on app_member;
```
### 使用create对字段的前N个字符创建普通索引
> 当遇到表中比较大的列时,列内容的前n个字符在所有内容中已经接近唯一时,这时可以对列的前n个字符建立索引,而无须对整个列建立索引,这样可以节省创建所以占用的系统空间,以及降低读取和更新维护索引消耗的系统资源
```
mysql> create index qq on app_member(qq(6));
mysql> show index from app_member\G # 更加详细的查看表的索引
```
### 为表的多个字段创建联合索引
```
mysql> create index reg_ip_time on app_member(reg_ip,reg_time);
```
## 创建唯一索引
```
mysql> create unique index nickname on app_member(`nickname`);
mysql> drop index nickname on app_member;
#使用alter新增唯一索引方式操作
mysql> alter table app_member add unique key nickname(`nickname`);
#使用alter方式删除索引操作
mysql> alter table app_member drop key nickname;
```
## 索引列的创建生效条件
#### 既然所以可以加快查询速度,那么给所有的列建立索引?
> 因为索引不但占用系统空间,更新数据库时还需要维护索引数据,因此,索引是一把双刃剑,并不是越多越好。
> 例如:数十到数百行的小表上无需建立索引,更新频繁,读取较少的表要少建立索引。
#### 需要在那些列创建索引呢?
> 索引一定要创建在**where后的条件列**上,而不是select后的选择数据列上。
> 另外我们要尽量选择**唯一值多**的**大表上**建立索引
* * * * *
# 小结
> 创建主键索引
> `alter table app_member change uid uid int primary key;`
> 删除主键索引
> `alter table app_member drop primary key;`
> 创建普通索引
> `alter table app_member add index qq(qq(6));`
> 根据列的前n个字符创建索引
> `create index qq on app_member(qq);`
> 根据多个列创建联合索引
> `create index reg_time_ip on app_member(reg_time,reg_ip);`
> 根据多个列的前n个字符创建联合索引
> `create index reg_time_ip on app_member(reg_time(8),reg_ip(8));`
> 删除普通索引
> `alter table app_member drop index nickname;`
- 写在前面
- MySQL的使用
- MySQL多表同时删除方案
- MySQL跨表、多表更新SQL语句总结
- MySQL存储引擎
- 安装
- 常规方式编译安装MySQL
- 采用cmake方式编译安装MySQL
- 使用rpm包安装MySQL
- 使用yum方式安装MySQL
- 采用二进制方式免编译安装MySQL
- 多实例的安装
- 什么是多实例
- 多实例的作用、问题以及应用场景
- 多实例安装01【推荐】
- 多实例官方安装方案02
- 启动、用户和权限管理
- 单实例MySQL的启动和关闭的方法
- 设置及修改MySQL root用户密码
- 找回丢失的MySQL root用户密码
- 创建MySQL用户及用户权限管理
- 基础命令的操作
- MySQL库和表相关操作
- MySQL中的索引操作
- MySQL常用命令
- MySQL的错误代码
- MySQL复习秘籍
- 备份与恢复
- 备份
- 恢复
- mysqlbinlog命令
- 服务日志
- 主从复制
- 主从复制部署配置问题汇总
- 主从复制读写分离
- 灾难恢复
- 配置phpmyadmin连接多实例MySQL
- 其他相关
- Sphinx实验
- 中文分词技术
- MySQL语句大全
- 用户创建、权限、删除
- 数据库与表显示、创建、删除
- 表复制及备份还原
- 数据库表中数据操作
- 修改表的列与表名
- 修改表中的数据
- 查询表
- 日志
- 批量修改Mysql表引擎为InnoDB的方法
- 数据库抽象层 PDO
- PDO对象常用方法
- PDO 事务处理
- PDO 与 MySQLi 二者效率简单比较
- 大小写敏感性 lower_case_table_names
- CentOS7安装MySQL5.7密码查看与修改