作业:
--20
-- 5. 统计总数据量(不包含系统表)
-- 6. 统计每个库的数据量(不包含系统表)
SELECT
table_schema,
SUM( TABLE_ROWS * AVG_ROW_LENGTH + index_length)/1024/1024 AS "total_mb"
FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema','sys')
GROUP BY table_schema
ORDER BY total_mb DESC ;
扩展题
将school库下所有的数据字典信息(列名,数据类型,注释信息)进行统计
例如:
id int 城市id
name varchar 城市名
SELECT column_name,column_type,column_comment
FROM information_schema.columns
WHERE table_schema='school'
.....
模仿以下语句,生成数据库下单表的备份语句(不包含系统表),并保存至/backup/sh/bak.sh
例子语句:
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
mysqldump -uroot -p123 world city >/backup/world_city.sql
select concat('mysqldump -uroot -p123 ' ,table_schema, ' ' ,table_name ', >/backup/',table_schema,'_',table_name,'.sql' ) from information_schema.tables
where table_schema not in ('mysql','information_schema','performance_schema','sys')
into outfile '/backup/sh/bak.sh';
select user,host from mysql.user;
上节回顾:
case
case when 判断条件 then 输出结果 end
及格人数/总人数
count(case when sc.score>=60 then 1 end )/count(sc.sno)information_schema 视图库
2.1 视图
create view v_xxx as
select a.tname AS "老师姓名" ,group_concat(d.sname) AS "不及格的学生"
from teacher AS a
join course AS b
on a.tno = b.tno
join sc AS c
on c.cno = b.cno
join student AS d
on d.sno = c.sno
where c.score < 60
group by a.tno;
select * from v_xxx ;
2.2 tables , columns
tables :
TABLE_SCHEMA : 表所在的库
TABLE_NAME : 表名
ENGINE : 引擎
TABLE_ROWS : 表的行数
AVG_ROW_LENGTH: 平均行长度
INDEX_LENGTH : 索引长度
TABLE_COMMENT : 表的注释
-- 1. 所有库名统计,总数据量
show databases;
-- 2. 所有库中的所有表的信息
show tables from xxx;
-- 3. 统计每个库,表的数量和库数据量
-- 5. 统计每个库下,每个表的表名,引擎,数据行,数据量,注释.
-- 6. 所有业务表进行数据字典统计 (表名,列名,数据类型,属性,注释)
基础
- 介绍安装
2.体系结构管理 - SQL基础及元数据获取
- SQL基础优化-索引及执行计划
核心技术
- 存储引擎
- 日志管理
- 备份恢复
- 主从复制
高级-架构篇
- 高可用及读写分离
- 分布式数据库架构
- MySQL全面优化
NoSQL部分
云数据库部分
=====================================================================
SQL基础优化-索引及执行计划 *****
一. 索引
面试,工作必备
什么是索引?
相当与一本书中的目录,用来加速查询.索引算法的演变
二叉树 ---> 红黑树---> BTREE ----> B+TREE(B*TREE)
目的是快速的确认范围MySQL支持的索引类型
B+TREE *****
HASH
RTREE
FullTEXT
GIS索引BTREE查找算法介绍
B-Tree
B+Tree(B*Tree)
区别: leaf节点和no-leaf节点,有相邻的指针.MySQL中的BTREE如何构建 *****
6.1 聚簇索引
生成条件:
自动选择主键列(PK),没有主键会自动选择UK,如果都没有自动生成隐藏列
InnoDB 才有聚簇索引.
功能:
1.数据存储时,按照聚簇索引列顺序在磁盘上有序的存储在连续数据页上(16K)---->索引组织表(IOT)
如何构建:将有序的整表数据行所在数据页,作为叶子节点
按照聚簇索引列值,向上生成枝节点和根节点
查询:
按照聚簇索引列作为查询条件时,等值查询,发生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. 减少回表次数
联合索引使用:减少ID的个数
覆盖索引: 辅助索引中有所有要查询的值
- 索引管理
7.1 索引的查询
desc city;
show index from city;
7.2 创建索引(辅助索引)
7.2.1辅助索引的细分
(1) 单列索引
-- 创建:
mysql> alter table city add index idx_na(name);
-- 删除:
mysql> alter table city drop index idx_na;
(2) 唯一索引
alter table xxxx add unique index xxx(列);
alter table xxxx drop index xxx;
(3)前缀索引
mysql> alter table city add index idx_na(name(10));
mysql> alter table city drop index idx_na;
索引树的高度?
- 行数多
拆分表: 归档表,分区表,分布式数据库 - 索引列值过长.
前缀索引 - 数据类型影响
(1)简短数据类型替代长繁琐数据类型.
(2)变长最好是varchar()类型.
(3)enum()灵活应用.
(5)联合索引
mysql> alter table city add index idx_na_co(name,countrycode);
(a,b,c)
- 构建时,取出id+a+b+c,依次a-->b--->c 的顺序,进行数据行的排序
- 枝节点和根节点,只会保存最左列的索引值.
联合索引查询时,遵循最左原则.最左列尽量使用重复值少的列.
把控一个原则: 建立了联合索引,尽量应用完整
如何确认一个查询,对于联合索引应用长度?
a ab abc
(a,b,c) 会? 部分?
where a=? 会 a
where b=? 不会
where c=? 不会
where a=? and b=? and c=? 会 abc
where b=? and c=? and a=? 会 abc
where a=? and b>? and c=? 会 ab
where a=? and b like ? and c=? 会 ab
where a=? and c=? 会 a
where a=? and b=? 会 ab
where b=? and c=? 不会
多子句:
where a and c group by b -----> acb
=========================
二. 执行计划获取及分析
在SQL执行之前,将优化器选择后的执行计划获取出来进行分析
- 命令 (desc)
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)
mysql>
1.1 table
主要针对多表比较有意义.
1.2 type 查询类型 *****
全表扫描 : ALL
索引扫描 : index,range,ref,eq_ref,const(system)
获取不到数据 : NULL
1.3 possible_keys ***
可能会用到的索引. CBO(代价),RBO(规则)
1.5 key ***
真正用到的索引
1.6 key_len *****
索引覆盖长度,主要是用来确认联合索引覆盖长度
1.7 rows
查询结果集行数.
1.8 Extra *****
额外信息
- 重要信息详解
2.1 type详解
2.1.1 ALL : 全表扫描
原因:
(1) 查询条件没有索引
where group by order by select后的列
select * from city;
(2) 查询条件不满足索引应用规则
查询条件是不确认值时,不走索引
mysql> desc select * from city where countrycode != 'CHN';
mysql> desc select * from city where countrycode like '%CH%' ;
(3)其他原因
放一放.
2.1.2 index : 全索引扫描
mysql> desc select countrycode from city;
2.1.3 range: 索引的范围扫描
< >= <= ,like, between and
in ,or
mysql> desc select * from city where id<100;
mysql> desc select * from city where countrycode like 'CH%' ;
desc
select * from city where countrycode='CHN'
union all
select * from city where countrycode='USA';
2.1.5 ref : 辅助索引等值查询
desc select * from city where countrycode='CHN';
2.1.6 eq_ref : 多表连接时,右表中的on的连接条件是主键或唯一键
mysql> desc select city.name,country.name from city join country on city.countrycode=country.code where city.population<100;
2.1.7 const(system): 聚簇索引或者唯一索引的等值查询
mysql> desc select * from city where id=10;
2.2 key_len 计算规则
反应的是,在联合索引应用长度
not null null
tinint 1bytes 1+1
int 4bytes 4+1
create table t1(
n1 int not null, 4
n2 int , 5
n3 tinyint not null 1
)
utf8 not null null
char(10) 30 31
varchar(10) 30+2 33
create table t1(
n1 char(20) not null, 203 60
n2 int , 4+1 5
n3 varchar(30) 303+2+1 93
)
utf8mb4 not null null
char(10) 410 40+1
varchar(10) 410+2 40+2+1
create table t1(
n1 char(20) not null, 204 80
n2 int , 4+1 5
n3 varchar(30) 304+2+1 123
)
where a=? 会 a
where b=? 不会
where c=? 不会
where a=? and b=? and c=? 会 abc
where b=? and c=? and a=? 会 abc
where a=? and b>? and c=? 会 ab
where a=? and b like ? and c=? 会 ab
where a=? and c=? 会 a
where a=? and b=? 会 ab
where b=? and c=? 不会
where a=? and b>? and c=? 会 ab
where a=? and b like ? and c=? 会 ab
联合索引应用规则:
- 把唯一值多的放在最前面
- 理论上要将不等值的列放在最后面
- key_len 覆盖长度越长越好.
- 查询条件结果能够全部从辅助索引覆盖最好,减少回表次数.
- where配合groupby 或者order by ,按照子句执行顺序联合索引.
where b group by a
where b order by a