数据库-day05

课程安排

基础
1.介绍安装
2.体系结构管理
3.SQL基础及元数据获取
4.SQL基础优化-索引及执行计划
核心技术
1.存储引擎
2.日志管理
3.备份恢复
4.主从复制
高级-架构篇
1.高可用及读写分离
2.分布式数据库架构
3.MySQL全面优化

SQL基础优化-索引及执行计划*****

1.什么是索引?

相当于一本书的目录,用来加速查询

2.索引算法的演变
 1.演变:  二叉树-->红黑树-->btree-->B+TREE(B*TREE)
 2.目的是快速的确认范围
 3.mysql支持的索引 类型
    B+TREE*****HASH  RTREE  FULLTEXT  GIS索引
 4.BTREE查找算法介绍
 5区别:leaf节点和no-leaf节点,有相邻的指针
图片.png

MySQL中的BTREE如何构建****

聚簇索引(聚集索引,集聚索引)
1.自动选择主键列(PK),没有主键会自动选择UK,如果都没有自动生成隐藏列
innodb 才有聚簇索引
功能:
    1.数据存储时,按照聚簇索引列顺序在磁盘上有序的存储在连续数据页上(16K) ---->索引组织表(IOT)
如何构建:
    1.将有序的整表数据行所在数据页,作为叶子节点
    2.按照聚簇索引列值,向上生成枝节点和跟节点
查询:
    按照聚簇索引列作为查询条件时,等值查询,发生3次IO即可获得数据行
    如果是范围查询,利用叶子节点双向指针继续优化查询
辅助索引:alter table t1 add index idx(name)
构建:
  1.提取name列值+ID列值,按照name列值的升序排序
  2.将排好序的数据,均匀的,有序的存储到新的叶子节点中
  3.通过name的值向上生成枝节点和跟节点
查询:
    1.按照name作为查询条件时,遍历辅助引树,得到PK
    2.拿着PK的值进行回表查询
总结
1,减少查询次数
2.减少IO的次数
3.等值,缩小范围
4.尽量使用聚簇索引查询
5.减少回表次数
6.联合索引使用:减少ID的个数
7.覆盖索引使用:辅助索引中有所有要查询的值

索引管理

1.索引的查询
desc city;
show index from city

f辅助索引的细分

创建索引
唯一索引
alter table xxx add 
索引树的高度?
1.行数多
    拆分表:归档表,分区表,分布式数据库
2.索引列值过长
    前缀索引,
3.数据类型影响
    01.简短数据类型替代长繁琐数据类型
    02.变成最好是varchar()类型,
    03.灵活使用enum()
联合索引
mysql> alter table city add index idx_na_co(name,countrycode);
查看创建的联合索引
show index from city;
(a,b,c)
1.构建时,取出id+a+b+c,依次a-->b-->c的顺序,进行数据行的排序
2.枝节点和根节点,只会保存最左列的索引值
联合索引查询时,遵循最左原则,最左列尽量使用重复值少的列。
把控一个原则:建立了联合索引,尽量应用完整
如何确认一个查询,对于联合索引应用长度?
多字句:
where a and b group by c   

执行计划获取及分析

在SQL执行之前,将优化器选择后的执行计划获取出来进行分析

1.命令使用方法 (desc)
mysql> mysql> desc select * from city where countrycode='CHN';
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | city  | NULL       | ref  | CountryCode   | CountryCode | 3       | const |  363 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
table:针对多表时比较有意义,确认那张表出了问题
type:查询类型*****
全表扫描:all
索引扫描:index,range,fef,eq_ref,const(system)
获取不到数据:NULL 
possible_keys:可能会用到的索引。CBO(代价),RBO(规则)
key*****
真正用到的索引 
key_len*****
索引覆盖长度,主要是用来确认联合索引覆盖长度
rows
查询结果集行数
Extra
额外信息
重要信息详解
1.type详解
  ALL:全表扫描
  原因:
  查询条件没有索引
  where group by order by select后的列
  查询条件不满足索引应用规则
  查询条件是不确认值时,不走索引、
    mysql> desc select * from city where countrycode !='CHN';
    desc select * from city where countrycode like '%CHN%';
其他原因
  indx:全索引扫描
    desc select countrycode from city;
range:索引范围扫描
  >< >= <= like between and
  in or
    desc select * from city where id<100;
    desc select * from city where countrycode like 'CH%';
  desc
  select * from city where countrycode='CHN'
  union all
  select * from city where countrycode='USA';
ref :辅助索引等值查询
    desc select * from city where countrycode='CHN';
eq_ref:多表连接时,右表中的on的连接条件是主键或唯一键
    mysql> desc select city.name,country.name from city join country on city.countrycode=country.code where city.population<100;
const(system):聚簇索引或者唯一索引的等值查询
    desc select * from city where id=10;
NULL 没有获取到数据
    desc select * from city where id=10;
key_len 计算规则
反应的是,在联合索引应用长度

你可能感兴趣的:(数据库-day05)