MySQL-DBA课程-Day06

第二部分 MySQL 核心技术课程介绍

  1. 索引
  2. 存储引擎
  3. 日志
  4. 备份
  5. 主从
    ===========================

1. 索引及执行计划

1.1 介绍
相当于一本书中的目录,优化查询.
1.2 MySQL索引的类型(算法)
BTREE (Banlance Tree) ★★★★★★
HASH
FULLTEXT
RTREE
GIS

1.3 索引算法的演变
1.3.1 BTREE算法 由来
BTREE讲究的是查找数据的平衡,让我们的查询可以快速锁定范围
1.3.2 BTREE 的增强之路
B-TREE ------> 叶子节点双向指针 ------> 非叶子结点双向指针 -----> BTREE
1.3.3 BTREE 数据结构构建过程 *****
(1) 数据排序(默认是从小到大)
(2) 将数据有序的存储到16KB数据页,生成叶子(leaf node)节点.
(3) 通过叶子节点范围(最小值到下个叶子节点最小值)+每个叶子节点指针生成non-leaf.
(4) 通过non-leaf节点的范围(最小值到下个non-leaf节点最小值)+每个 non-leaf指针生成root.
(5) B
TREE中,为了进一步优化范围查询,加入了leaf双向指针,non-leaf双向指针.

    1. 减少索引IO次数,有效的较少IOPS
    1. 减少了随机IO的数量
    1. 减少IO量级

1.4 MySQL的 索引组织表(InnoDB)★★★★★★
(1) Clusterd Index: 聚簇(聚集,集群)索引
前提:
1. MySQL默认选择主键(PK)列构建聚簇索引BTREE.
2. 如果没有主键,自动选择第一个唯一键的列构建聚簇索引BTREE.
3. 如果以上都没有,会自动按照rowid生成聚簇索引.

说明:
  1. 聚簇索引,叶子节点,就是原始的数据页,保存的是表整行数据.
  2. 为了保证我们的索引是"矮胖"结构,枝节点和根节点都是只保存ID列值范围+下层指针.

(2) Secondary Index: 辅助(二级)索引
构建过程: alter table t1 add index idx(name)
1.提取name+id列的所有值
2.按照name自动排序,有序的存储到连续的数据页中,生成叶子节点
3. 只提取叶子节点name范围+指针,生成枝节点和根节点

(3) 针对 name列的查询,是如何优化?
select * from t1 where name='bgx';
1. 按照查询条件bgx,来带基于Name列构建的辅助索引进行遍历
理论上读取page为3次,找到主键值
2. 根据ID值,回到聚簇索引树,继续遍历,进而找到所需数据行.
理论读取的数据页为3次.
1.5 辅助索引细分
1.5.1 单列
1.5.2 联合索引 *****
例如:
idx(a,b,c)
理论上可以有效的避免回表的次数.
1.5.3 唯一索引
手机号,身份证号类似的列.
理论上通过唯一索引作为遍历条件的话,读取6个page即可获取数据行.

1.6 索引树高度问题,影响的原因?
(1) 数据行数多.
分区表(现在用的少).
归档表.
分库分表
(2) 选取的索引列值过长
前缀索引.
test(10)
(3) varchar(64) char(64) enum()等数据类型的影响
1.7 索引管理操作
1.7.1 查询索引
desc city;
key:
PRI : 主键
UNI : 唯一键
MUL : 普通

mysql> show index from city\G
select 
table_schema,table_name,
column_name ,
data_type,Column_key ,
COLUMN_COMMENT from information_schema.columns 
WHERE table_schema NOT IN ('sys','informatiion_schema','performance_schema','mysql');

1.7.2 创建索引

例子:
-- 1. 单列索引例子
select * from city where population>10000000
索引设计:
mysql> alter table city add index idx_popu(population);

说明:
1. 作为 where 查询条件的列.
2. 经常作为 group by ,order by,distint,union的列创建索引.
-- 2. 联合索引例子
select * from city where district='shandong' and name='jinan';

索引设计:
mysql> alter table city add index idx_dis_name(district,name);

说明:
联合索引排列顺序,从左到右.重复值少的列,优先放在最左边.

-- 3. 前缀索引应用(字符串)
mysql> alter table city add index idx_name(name(5));
-- 4. 唯一索引
mysql> alter table student add unique index idx_tel(xtel);
mysql> desc student;
1.7.3 删除索引
mysql> alter table city drop index idx_dis_name;

  1. 执行计划(explain)分析
    2.0 命令
    explain select
    desc select
    2.1 使用场景
    (1) 语句执行之前 : 防患未然
    (2) 出现慢语句时 : 亡羊补牢
    2.2 执行计划结果查看(优化器选择后的执行计划)
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)

2.3 重点关注指标说明
table: 发生在哪张表的执行计划.
type : 查询的类型
全表扫描 : ALL
索引扫描 : index < range < ref < eq_ref < connst(system)< NULL ★★★★★
possible_keys : 可能用到的索引
key : 此次查询走的索引名.
key_len : 索引覆盖长度.评估联合索引应用长度的. ★★★★★
rows : 扫描了表中的多少行
Extra : 额外的信息 ★★★★
2.4 type
(1) ALL : 全表扫描

mysql> desc select * from city;
mysql> desc select * from city where 1=1 ;
mysql> desc select * from city where population=42;
mysql> desc select * from city where countrycode !='CHN';
mysql> desc select * from city where countrycode not in ('CHN','USA');
mysql> desc select * from city where countrycode like '%CH%';

(2) index : 全索引扫描
mysql> desc select countrycode from city;
(3) range : 索引范围扫描(最常见)

< >= <= like
in or

mysql> desc select  *  from city where id<10;
mysql> desc select * from city where countrycode like 'CH%';
mysql> desc select * from city where countrycode  in ('CHN','USA');
改写: 
desc 
select * from city where countrycode='CHN'
union all 
select * from city where countrycode='USA'

(4) ref 辅助索引等值查询
desc
select * from city where countrycode='CHN';

(5) eq_ref 多表关联查询中,非驱动表的连接条件是主键或唯一键

desc 
select 
city.name,
country.name ,
city.population 
from city 
join country 
on city.countrycode=country.code
where city.population<100;

(6) const(system) :主键或者唯一键等值查询
mysql> desc select * from city where id=10;

(7) NULL 索引中获取不到数据
mysql> desc select * from city where id=100000;
2.5 key_len详细说明
2.5.1 作用
判断联合索引覆盖长度

2.5.2 最大覆盖长度的计算方法
idx(a,b,c) ====> a(10)+b(20)+c(30)
(1) 影响计算的条件
字符集 : utf8mb4

数字类型
tinyint 1 Bytes
int 4 Bytes
bigint 8 Bytes

字符串类型
char(5) 54 Bytes
varchar(5) 5
4 Bytes + 2 Bytes

没有 not null : 多一个字节存储是否为空
测试表:

create table keyt (
id int not null primary key auto_increment,
num int not null, 
num1 int ,
k1 char(10) not null ,
k2 char(10) , 
k3 varchar(10) not null ,
k4 varchar(10)
)charset=utf8mb4;

num : 4
num1: 5
k1 : 40
k2 : 41
k3 : 42
k4 : 43
2.5.3 联合索引应用"道道" *****
-- 建立联合索引时,最左侧列,选择重复值最少的列.
alter table keyt add index idx(a,b,c);
-- 例子:
-- 哪些情况可以完美应用以上索引.
desc select *from student where xname='张三' and xage=11 and xgender='m';
desc select *from student where xage=11 and xgender='m' and xname='张三' ;
desc select *from student where xgender='m' and xname='张三' and xage=11 ;
-- 影响到联合索引应用长度的.
-- 缺失 联合索引最左列,不走任何索引
mysql> desc select *from student where xage=11 and xgender='m' ;
-- 缺失中间部分,只能走丢失部分之前的索引部分
mysql> desc select *from student where xname ='张三' and xgender='m' ;
-- 查询条件中,出现不等值查询(> ,< ...like )
mysql> desc select *from student where xname ='张三' xage<18 and xgender='m' ;
联合索引应用长度到不等值列截断了.
-- 多子句
按照 select 子句顺序创建联合索引.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 作业:--20-- 5. 统计总数据量(不包含系统表)-- 6. 统计每个库的数据量(不包含系统表)SELECTt...
    斗魂_2e5d阅读 109评论 0 0
  • 上节回顾: 1. 作用 优化查询,类似于书中的目录 2. 算法分类 Btree Rtree Hash fullte...
    张鑫泽_2109阅读 212评论 0 0
  • MySQL-day07 CREATE TABLE`test_table`( `ID`bigint(20...
    王大楚阅读 407评论 0 0
  • 姓名:龚珊珊 公司:宁波大发化纤有限公司 《六项精进》301期感谢组学员 【日精进打卡第38天】 【知~学习】 《...
    Miss曲奇阅读 134评论 0 0
  • 今天坐火车由济南到青岛,早上出门有点想当然了,出门有点儿晚,让我家宝宝开车有些着急,以后还是要早点出门比较好,至...
    delayjia阅读 383评论 0 0