MySQL-08-索引简介




B树

基于不同的查找算法分类介绍

B*Tree

B-tree

B+Tree 在范围查询方面提供了更好的性能(> < >= <= like)

image-20210622104209713



索引简介

索引作用
	提供了类似于书中目录的作用,目的是为了优化查询
	
索引的种类(算法)
  B树索引
  Hash索引
  R树
  Full text
  GIS


索引分类

辅助索引(S)

辅助索引细分

1.普通的单列辅助索引

2.联合索引
	多个列作为索引条件,生成索引树,理论上设计的好的,可以减少大量的回表查询
	
3.唯一索引
	索引列的值都是唯一的

辅助索引(S)怎么构建B树结构

(1)索引是基于表中列(索引键)的值生成的B树结构
(2)首先提取此列所有的值,进行自动排序
(3)将排好序的值,均匀的分布到索引树的叶子节点中(16K)
(4)然后生成此索引键值所对应得后端数据页的指针
(5)生成枝节点和根节点,根据数据量级和索引键长度,生成合适的索引树高度
id  name  age  gender
select  *  from  t1 where id=10;
问题: 基于索引键做where查询,对于id列是顺序IO,但是对于其他列的查询,可能是随机IO


聚集索引(C)

前提

(1)表中设置了主键,主键列就会自动被作为聚集索引
(2)如果没有主键,会选择唯一键作为聚集索引
(3)聚集索引必须在建表时才有意义,一般是表的无关列(ID)

聚集索引(c)怎么构建B树结构

(1) 在建表时,设置了主键列(ID)
(2) 在将来录入数据时,就会按照ID列的顺序存储到磁盘上.(我们又称之为聚集索引组织表)
(3) 将排好序的整行数据,生成叶子节点.可以理解为,磁盘的数据页就是叶子节点

聚集索引和辅助索引构成区别

聚集索引只能有一个,非空唯一,一般是主键
辅助索引,可以有多个,是配合聚集索引使用的
聚集索引叶子节点,就是磁盘的数据行存储的数据页
MySQL是根据聚集索引,组织存储数据,数据存储时就是按照聚集索引的顺序进行存储数据
辅助索引,只会提取索引键值,进行自动排序生成B树结构

image-20210622141539997



索引树的高度受什么影响

1. 数据量级, 解决方法:分表,分库,分布式
2. 索引列值过长, 解决方法:前缀索引
3. 数据类型:
	变长长度字符串,使用了char,解决方案:变长字符串使用varchar
	enum类型的使用enum ('山东','河北','黑龙江','吉林','辽宁','陕西'......)


索引的基本管理

索引建立前

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   |     |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Field :列名字

key   :有没有索引,索引类型
  PRI :主键索引
  UNI :唯一索引
  MUL :辅助索引(单列,联和,前缀)

单列普通辅助索引

建表后创建:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL]  INDEX | KEY  [索引名] (字段名1 [(长度)] [ASC | DESC]) [USING 索引方法];

或
CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 ON  表名(字段名) [USING 索引方法];


1 创建索引
mysql> alter table city add index idx_name(name);  # 方法1                                    
mysql> create index idx_name1 on city(name);			 # 方法2
mysql> show index from city;
注意:以上操作不代表生产操作,不建议在一个列上建多个索引。同一个表中,索引名不能同名


2 删除索引:
mysql> alter table city drop index idx_name;

覆盖索引(联合索引)

mysql> alter table city add index idx_co_po(countrycode,population);

前缀索引

mysql> alter table city add index idx_di(district(5));
注意:数字列不能用作前缀索引

唯一索引

mysql> alter table city add unique index idx_uni1(name);
ERROR 1062 (23000): Duplicate entry 'San Jose' for key 'idx_uni1'


统计city表中,以省的名字为分组,统计组的个数
mysql> select district,count(id) from city group by district;

需求: 找到world下,city表中 name列有重复值的行,最后删掉重复的行
mysql> select name,count(id) as cid from city group by name  having cid>1 order by cid desc;
mysql> select * from city where name='suzhou';


posted @ 2021-06-22 14:42  李成果  阅读(75)  评论(0编辑  收藏  举报