一、索引介绍
1.1、索引作用
提供了类似于书中目录的作用,目的是为了优化查询
1.2、索引算法上分类
大的分类:
B树索引 Hash索引 R树 Full text GIS #地图类索引 ------------------------------- #B树基于不同的查找算法分类: B-tree 以下两种类型在范围查询方面提供了更好的性能(> < >= <=) B+Tree B*Tree
1.3、索引功能上的分类
1.3.1、辅助索引
1)辅助索引(S)怎么构建B树结构的?
- (1)索引是基于表中列(索引键)的值生成的B树结构
- (2)首先提取此列所有的值,进行自动排序
- (3)将排好序的值,均匀的分布到索引树的叶子节点中(16K)
- (4)然后生成此索引键值所对应得后端数据页的指针
- (5)生成枝节点和根节点,根据数据量级和索引键长度,生成合适的索引树高度
2)辅助索引细分
- 1)普通的单列辅助索引(普通索引)
- 2)覆盖索引(联合索引):多个列作为索引条件,生成索引树,理论上设计的好的,可以减少大量的回表查询
- 3)唯一索引:索引列的值都是唯一的.
1.3.2、聚集索引
1)前提
- (1)表中设置了主键,主键列就会自动被作为聚集索引.
- (2)如果没有主键,会选择唯一键作为聚集索引.
- (3)聚集索引必须在建表时才有意义,一般是表的无关列(ID)
2)聚集索引(C)怎么构建B树结构的?
- (1) 在建表时,设置了主键列(ID)
- (2) 在将来录入数据时,就会按照ID列的顺序存储到磁盘上.(我们又称之为聚集索引组织表)
- (3) 将排好序的整行数据,生成叶子节点.可以理解为,磁盘的数据页就是叶子节点
1.3.3、索引高度影响因数
1)数据量级, 解决方法:分表,分库,分布式
2)索引列值过长 , 解决方法:前缀索引
3)数据类型:
变长长度字符串,使用了char,解决方案:变长字符串使用varchar
扫描二维码关注公众号,回复:
7434640 查看本文章
enum类型的使用enum ('山东','河北','黑龙江','吉林','辽宁','陕西'......)
1.3.4、B树查找算法
二、索引基本管理
2.1、查看索引
mysql> desc city; +-------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Name | char(35) | NO | | | | | CountryCode | char(3) | NO | MUL | | | | District | char(20) | NO | | | | | Population | int(11) | NO | | 0 | | +-------------+----------+------+-----+---------+----------------+ Field :列名字 key :有没有索引,索引类型 PRI: 主键索引 UNI: 唯一索引 MUL: 辅助索引(单列,联和,前缀) mysql> show index from city; +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | city | 0 | PRIMARY | 1 | ID | A | 4188 | NULL | NULL | | BTREE | | | | city | 1 | CountryCode | 1 | CountryCode | A | 4188 | NULL | NULL | | BTREE | | | +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2.2、索引创建修改删除
1)创建索引
alter table city add index idx_name(name); #方法一 create index idx_name1 on city(name); #方法二 show index from city;
2)删除索引
alter table city drop index idx_name1; #直接删除索引名称即可
3)覆盖索引(联合索引)
alter table city add key idx_co_po(countrycode,population); #多个字段上建立索引 alter table city add index idx_co_po(countrycode,population); #多个字段上建立索引
4)前缀索引
alter table city add index idx_di(district(5)); #在前5个字符上建立索引
5)唯一索引
alter table city add unique index idx_uni1(name); ERROR 1062 (23000): Duplicate entry 'San Jose' for key 'idx_uni1' #唯一键冲突