数据库5

作业:
--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;

上节回顾:

  1. case
    case when 判断条件 then 输出结果 end
    及格人数/总人数
    count(case when sc.score>=60 then 1 end )/count(sc.sno)

  2. 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. 所有业务表进行数据字典统计 (表名,列名,数据类型,属性,注释)

基础

  1. 介绍安装
    2.体系结构管理
  2. SQL基础及元数据获取
  3. SQL基础优化-索引及执行计划

核心技术

  1. 存储引擎
  2. 日志管理
  3. 备份恢复
  4. 主从复制

高级-架构篇

  1. 高可用及读写分离
  2. 分布式数据库架构
  3. MySQL全面优化

NoSQL部分
云数据库部分

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

一. 索引

面试,工作必备

  1. 什么是索引?
    相当与一本书中的目录,用来加速查询.

  2. 索引算法的演变
    二叉树 ---> 红黑树---> BTREE ----> B+TREE(B*TREE)
    目的是快速的确认范围

  3. MySQL支持的索引类型
    B+TREE *****
    HASH
    RTREE
    FullTEXT
    GIS索引

  4. BTREE查找算法介绍
    B-Tree
    B+Tree(B*Tree)
    区别: leaf节点和no-leaf节点,有相邻的指针.

  5. MySQL中的BTREE如何构建 *****
    6.1 聚簇索引
    生成条件:
    自动选择主键列(PK),没有主键会自动选择UK,如果都没有自动生成隐藏列
    InnoDB 才有聚簇索引.
    功能:
    1.数据存储时,按照聚簇索引列顺序在磁盘上有序的存储在连续数据页上(16K)---->索引组织表(IOT)
    如何构建:

  6. 将有序的整表数据行所在数据页,作为叶子节点

  7. 按照聚簇索引列值,向上生成枝节点和根节点

查询:
按照聚簇索引列作为查询条件时,等值查询,发生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的个数
覆盖索引: 辅助索引中有所有要查询的值

  1. 索引管理
    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. 索引列值过长.
    前缀索引
  3. 数据类型影响
    (1)简短数据类型替代长繁琐数据类型.
    (2)变长最好是varchar()类型.
    (3)enum()灵活应用.

(5)联合索引
mysql> alter table city add index idx_na_co(name,countrycode);
(a,b,c)

  1. 构建时,取出id+a+b+c,依次a-->b--->c 的顺序,进行数据行的排序
  2. 枝节点和根节点,只会保存最左列的索引值.
    联合索引查询时,遵循最左原则.最左列尽量使用重复值少的列.

把控一个原则: 建立了联合索引,尽量应用完整
如何确认一个查询,对于联合索引应用长度?
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执行之前,将优化器选择后的执行计划获取出来进行分析

  1. 命令 (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 *****
额外信息

  1. 重要信息详解
    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) 30
3+2+1 93
)

utf8mb4 not null null
char(10) 410 40+1
varchar(10) 4
10+2 40+2+1

create table t1(
n1 char(20) not null, 204 80
n2 int , 4+1 5
n3 varchar(30) 30
4+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

联合索引应用规则:

  1. 把唯一值多的放在最前面
  2. 理论上要将不等值的列放在最后面
  3. key_len 覆盖长度越长越好.
  4. 查询条件结果能够全部从辅助索引覆盖最好,减少回表次数.
  5. where配合groupby 或者order by ,按照子句执行顺序联合索引.
    where b group by a
    where b order by a

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