課程安排
基礎(chǔ)
1.介紹安裝
2.體系結(jié)構(gòu)管理
3.SQL基礎(chǔ)及元數(shù)據(jù)獲取
4.SQL基礎(chǔ)優(yōu)化-索引及執(zhí)行計劃
核心技術(shù)
1.存儲引擎
2.日志管理
3.備份恢復(fù)
4.主從復(fù)制
高級-架構(gòu)篇
1.高可用及讀寫分離
2.分布式數(shù)據(jù)庫架構(gòu)
3.MySQL全面優(yōu)化
SQL基礎(chǔ)優(yōu)化-索引及執(zhí)行計劃*****
1.什么是索引?
相當于一本書的目錄惧笛,用來加速查詢
2.索引算法的演變
1.演變: 二叉樹-->紅黑樹-->btree-->B+TREE(B*TREE)
2.目的是快速的確認范圍
3.mysql支持的索引 類型
B+TREE*****HASH RTREE FULLTEXT GIS索引
4.BTREE查找算法介紹
5區(qū)別:leaf節(jié)點和no-leaf節(jié)點因妇,有相鄰的指針
圖片.png
MySQL中的BTREE如何構(gòu)建****
聚簇索引(聚集索引叉寂,集聚索引)
1.自動選擇主鍵列(PK)狼犯,沒有主鍵會自動選擇UK外里,如果都沒有自動生成隱藏列
innodb 才有聚簇索引
功能:
1.數(shù)據(jù)存儲時疏虫,按照聚簇索引列順序在磁盤上有序的存儲在連續(xù)數(shù)據(jù)頁上(16K) ---->索引組織表(IOT)
如何構(gòu)建:
1.將有序的整表數(shù)據(jù)行所在數(shù)據(jù)頁永罚,作為葉子節(jié)點
2.按照聚簇索引列值,向上生成枝節(jié)點和跟節(jié)點
查詢:
按照聚簇索引列作為查詢條件時卧秘,等值查詢呢袱,發(fā)生3次IO即可獲得數(shù)據(jù)行
如果是范圍查詢,利用葉子節(jié)點雙向指針繼續(xù)優(yōu)化查詢
輔助索引:alter table t1 add index idx(name)
構(gòu)建:
1.提取name列值+ID列值翅敌,按照name列值的升序排序
2.將排好序的數(shù)據(jù)羞福,均勻的,有序的存儲到新的葉子節(jié)點中
3.通過name的值向上生成枝節(jié)點和跟節(jié)點
查詢:
1.按照name作為查詢條件時蚯涮,遍歷輔助引樹治专,得到PK
2.拿著PK的值進行回表查詢
總結(jié)
1卖陵,減少查詢次數(shù)
2.減少IO的次數(shù)
3.等值,縮小范圍
4.盡量使用聚簇索引查詢
5.減少回表次數(shù)
6.聯(lián)合索引使用:減少ID的個數(shù)
7.覆蓋索引使用:輔助索引中有所有要查詢的值
索引管理
1.索引的查詢
desc city;
show index from city
f輔助索引的細分
創(chuàng)建索引
唯一索引
alter table xxx add
索引樹的高度张峰?
1.行數(shù)多
拆分表:歸檔表泪蔫,分區(qū)表,分布式數(shù)據(jù)庫
2.索引列值過長
前綴索引挟炬,
3.數(shù)據(jù)類型影響
01.簡短數(shù)據(jù)類型替代長繁瑣數(shù)據(jù)類型
02.變成最好是varchar()類型鸥滨,
03.靈活使用enum()
聯(lián)合索引
mysql> alter table city add index idx_na_co(name,countrycode);
查看創(chuàng)建的聯(lián)合索引
show index from city;
(a,b谤祖,c)
1.構(gòu)建時婿滓,取出id+a+b+c,依次a-->b-->c的順序粥喜,進行數(shù)據(jù)行的排序
2.枝節(jié)點和根節(jié)點凸主,只會保存最左列的索引值
聯(lián)合索引查詢時,遵循最左原則额湘,最左列盡量使用重復(fù)值少的列卿吐。
把控一個原則:建立了聯(lián)合索引,盡量應(yīng)用完整
如何確認一個查詢锋华,對于聯(lián)合索引應(yīng)用長度嗡官?
多字句:
where a and b group by c
執(zhí)行計劃獲取及分析
在SQL執(zhí)行之前,將優(yōu)化器選擇后的執(zhí)行計劃獲取出來進行分析
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)
獲取不到數(shù)據(jù):NULL
possible_keys:可能會用到的索引婆咸。CBO(代價),RBO(規(guī)則)
key*****
真正用到的索引
key_len*****
索引覆蓋長度芜辕,主要是用來確認聯(lián)合索引覆蓋長度
rows
查詢結(jié)果集行數(shù)
Extra
額外信息
重要信息詳解
1.type詳解
ALL:全表掃描
原因:
查詢條件沒有索引
where group by order by select后的列
查詢條件不滿足索引應(yīng)用規(guī)則
查詢條件是不確認值時尚骄,不走索引、
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 沒有獲取到數(shù)據(jù)
desc select * from city where id=10;
key_len 計算規(guī)則
反應(yīng)的是,在聯(lián)合索引應(yīng)用長度