大家好,我是anyux。本文介绍MySQL数据库的索引创建与删除。

mysql 主键索引去重 mysql如何删除主键索引_ci

BTree树的索引分类

聚集索引,聚集索引一般是主键列辅助索引,辅助索引辅助聚集索引

聚集索引生成过程

MySQL会自动选择主键作为聚集索引列,没有主键列会选择唯一键,如果都没有会生成隐藏的主键列

MySQL进行存储时,会按照聚集索引列值的顺序,有序存储数据行聚集索引直接将原表数据页,作为叶子结点,然后提取聚集索引列向上生成枝和根

辅助索引生成过程

管理员选择一个列创建辅助索引

MySQL会自动将此列的值取出来将此列的值自动排序将排好序的数据,均匀的存储到索引的叶子节点生成枝节点和根节点

辅助索引的使用过程

先遍历辅助索引,找到对应的索引键值所对应的id值或者是主键值,进而使用主键值回到聚集索引,再进行遍历查询找到指行数据

聚集索引和辅助索引的区别

表中的任何一个列都可以创建辅助索引,在你有需要的时候,只要名字不同即可在一张表中,聚集索引只能有一个,一般是主键辅助索引,叶子结点只存储索引列的有序值聚集索引,叶子结点存储的是有序的整行数据MySQL的表数据存储是聚集索引组织表

mysql 主键索引去重 mysql如何删除主键索引_ci_02

辅助索引细分

单列辅助索引

联合索引(覆盖索引)[重要]

唯一索引

索引树高度通常情况下,千万级别的数据,索引树高度应该在3~4层,

数据行数较多时候

分表:MySQL自带的partion功能,使用的比较少了

分片:分布式架构(分库)

字段长度

业务允许,尽量选择长度短的列作为索引列

业务不允许,选择前缀索引

数据类型

对于变长长度的列来讲,使用varchar类型比char类型要有优势。对于大表而言,使用char数据类型的每个索引长度都是固定值,空格也算在索引的长度里面,而varchar不是。所以叶子结点的消耗较大,因而要选择varchar数据类型

索引的命令操作

索引查询

PRI 主键索引

MUL 辅助索引

UNI 唯一索引

use world;

查看索引

desc city;

查看索引详细信息

show index from city;

创建索引

注意,创建索引也是在线的DDL操作,操作时也会出现锁表现象。所以创建索引操作应该是业务低谷时间进行操作或者使用PTOSC这样的工具操作,减少对业务的影响

创建单列的辅助索引

use world;

为city表的name列创建索引

alter table city add index idx_name(name);

查看索引详情

show index from city;

创建联合多列的辅助索引

use world;alter table city add index idx_c_p(countrycode,population);

mysql 主键索引去重 mysql如何删除主键索引_ci_03

创建唯一索引

注意,首先需要判断创建索引的列是否存在重复值,存在重复值的列,无法创建唯一索引

use world;select count(district) from city;select count(distinct district) from city;

事实说明存在重复值,district列不应当做唯一索引

alter table city add unique index uidx_dis(district);

mysql 主键索引去重 mysql如何删除主键索引_mysql 主键索引去重_04

创建前缀索引

前缀索引和普通索引没差,只是不能使用数字作为索引列

use world;alter table city add index idx_dis(district(5));

删除索引

use world;show index from city;

mysql 批量删除索引

alter table city drop index idx_name;alter table city drop index idx_c_p;alter table city drop index idx_dis;