mysql高级笔记_MySQL高级部分笔记
有關(guān)于MySQL的高級部分筆記
這是一篇關(guān)于MySQL高級部分的筆記主要是,sql優(yōu)化以及mysql鎖的相關(guān)內(nèi)容,以及主從配置等內(nèi)容等比較基礎(chǔ)的優(yōu)化
一、邏輯架構(gòu)部分
邏輯架構(gòu)
邏輯架構(gòu)介紹圖如下
連接層:最上層是一些客戶端和連接服務(wù),包含本地的sock通訊大多時基于客戶端/服務(wù)端工具實現(xiàn)的類似于tcp/ip的通訊
服務(wù)層:完成大多數(shù)的核心服務(wù)的功能,如,SQL接口,并完成緩存的查詢SQL的分析和優(yōu)化以及部分內(nèi)置函數(shù)的執(zhí)行,所有款存儲引擎的功能
引擎層:存儲引擎真正的負(fù)責(zé)了MySQL中的數(shù)據(jù)的存儲和提取,服務(wù)器通過api與存儲引擎進(jìn)行通訊,常用的有MyISAM和InnoDB
存儲層:數(shù)據(jù)存儲在裸設(shè)備上,并完成與存儲引擎的交互
優(yōu)化主要是只使SQL的解析格式符合優(yōu)化器的優(yōu)化格式
存儲引擎
查看mysql的存儲引擎命令
# 看你的mysql提供了生么存儲引擎
show engines;
# 看當(dāng)前默認(rèn)的存儲引擎
show variables like ‘%storage_engine%‘;
MyISAM與InnoDB的對比如下表
對比項MyISAMInnoDB
主外鍵
不支持
支持
事務(wù)
不支持
支持
行表鎖
表鎖,即使操作一條記錄也會鎖住整個表,不適合高并發(fā)的操作
行鎖,操作時只鎖某一行,不對其他的行有影響,適合高并發(fā)的操作
緩存
只緩存索引不緩存真實數(shù)據(jù)
不僅緩存索引還要緩存真實數(shù)據(jù),對內(nèi)存的要求比較高,而且內(nèi)存的大小對性能有決定性的影響
表空間
小
大
關(guān)注點
性能
事務(wù)
默認(rèn)安裝
Y
Y
性能下降SQL慢的原因
查詢語句寫的爛
索引失效
單值索引
符合索引
關(guān)聯(lián)查詢太多join(設(shè)計缺陷)
服務(wù)器調(diào)優(yōu)及各個參數(shù)的設(shè)置(緩沖、線程數(shù)等)
SQL執(zhí)行加載的順序
手寫順序
select distinct
from
join on
where
group by
having
order by
limit
MySQL的執(zhí)行
from
on
join
where
group by
having
select
distinct
order by
limit
?
總結(jié)
二、索引及優(yōu)化部分
索引簡介
是什么
索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是數(shù)據(jù)結(jié)構(gòu)(查找+排序)
種類
B+樹索引
hash索引
全文索引
RTree索引
優(yōu)勢
提高數(shù)據(jù)的檢索效率降低的磁盤的io
降低數(shù)據(jù)的排序成本降低了cpu的消耗
劣勢
實際上索引也是一張表,保存主鍵與索引字段,指向?qū)嶓w表的記錄,也是要占用空間的
會降低對于insert,update,delete的速度
索引只是提高效率的一個因素
分類
單值索引:一個索引只包含一個列
唯一索引:索引的列必須唯一,可以有空值
復(fù)合索引:一個索引包含多個列
基本語法
# 創(chuàng)建
create [unique] index indexName on table(columnname(length));
alter tablename add [unique] index indexname on (columnname(length));
# 刪除
drop index [indexname] on tablename;
# 查看
show index from tablename\G
哪些情況適合建索引
主鍵自動建立唯一索引
頻繁作為查詢條件的字段
查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引
頻繁更新的字段不適合建立索引
where用不到的字段不創(chuàng)建索引
單鍵/組合索引的選擇問題(高并發(fā)下傾向于創(chuàng)建復(fù)合索引)
查詢中排序的字段排序字段通過索引訪問將大大提高訪問的速度
查詢中統(tǒng)計和分組的字段
哪些情況不適合建索引
表記錄太少
頻繁修改的字段
數(shù)據(jù)重復(fù)且分布平均的字段
性能分析
MySQL Query Optimizer 查詢優(yōu)化器
負(fù)責(zé)對select語句進(jìn)行優(yōu)化
性能瓶頸
cpu:cpu飽和的時候一般發(fā)生在數(shù)據(jù)裝入內(nèi)存或者從磁盤上讀取數(shù)據(jù)的時候
io:裝入數(shù)據(jù)元大于內(nèi)存容量的時候
服務(wù)器硬件:top,free,iostat,vmstat命令查看系統(tǒng)的性能狀態(tài)
三、Explain 執(zhí)行計劃
是什么
使用explain關(guān)鍵字可以模擬優(yōu)化器執(zhí)行sql查詢語句,從而知道,MySQL是如何處理你的sql語句的分析你的查詢語句或是表結(jié)構(gòu)的性能瓶頸
怎么用
explain + sql
執(zhí)行計劃包含的信息
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
字段解釋
id
id:select查詢的序列號,包含一組數(shù)字表示查詢中執(zhí)行select子句或操作表的順序
三種情況:id相同執(zhí)行順序由上至下
id不同如果是子查詢,id的序號會遞增,id越大優(yōu)先級越高,越先被執(zhí)行
id相同又不同會遵循上兩條規(guī)律
select_type
select_type: 查詢的類型主要是用于區(qū)別,普通查詢,聯(lián)合查詢,子查詢等復(fù)雜查詢
simple:簡單查詢不包含子查詢,或者union
primary:主查詢子查詢最外層的查詢
subquery:子查詢
derived:在from列表中包含的子查詢被標(biāo)記為dervied衍生,MySQL會遞歸執(zhí)行這些子查詢,把最終結(jié)果放在臨時表里
union:第二個select出現(xiàn)在union之后則被標(biāo)記為union,若union包含在from子句中,外層的select將被標(biāo)記為derived
union result:從union表中獲取結(jié)果的select
table顯示這一行數(shù)據(jù)是關(guān)于那一張表的
type
常見的訪問類型八種
allindexrangerefeq_refconst,systemnull
全表掃描
全索引掃描比all好
檢索指定范圍的行
非唯一性索引掃描,多條記錄匹配
唯一性索引掃描,表中只有一條記錄匹配常見于主鍵索引唯一索引
system表只有一行記錄const表示通過索引一次就找到了以為只匹配一行數(shù)據(jù)如將主鍵置于where列表中,MySQL就能將查詢轉(zhuǎn)化為const
最好到最差
system > const > eq_ref > ref > range > index > all
一般來說得保證查詢至少優(yōu)化到range最好到ref
prossiable_keys和key
prossiable_keys:顯示出在本次查詢中可能用到的索引,但是不一定用
keys:實際查詢的過程中實際使用的索引為null沒有使用索引,若查詢中使用覆蓋索引則在該索引僅出現(xiàn)在key列表中
key_len
索引字段的最大可能長度,并非實際長度,再不損失精確性的情況下越小越好
ref
顯示索引的那一列被使用了,如果可能的話盡量是個常數(shù)
rows
找到所需的記錄讀取的行數(shù)
extra
很重要的額外信息
using filesort:使用文件內(nèi)排序(壞)
using temporary:使用臨時文件(壞)
using index:使用索引(好)
using where:使用where
四、優(yōu)化的幾點建議
全值匹配
最佳左前綴法則
不在索引列上做任何的操作(計算,函數(shù),(自動or手動的類型轉(zhuǎn)換)),會導(dǎo)致索引失效而全表掃描
存儲引擎不能使用索引中范圍條件右邊的列
盡量使用覆蓋索引只訪問索引的查詢(索引列與查詢列一致),減少select *
mysql在使用不等于(!= 或 <>)的時候無法使用索引回單之全表掃描
is null ,is not null 也無法使用索引
like以通配符開頭會導(dǎo)致索引失效全表掃描
字符串不單引號索引失效
少用or用來連接時會使索引失效
永遠(yuǎn)小表驅(qū)動大表
group by/order by排序字段也會用到索引(左前綴,盡量使用where)
五、查詢截取分析
慢查詢?nèi)罩窘厝÷齭ql
# 查看
show variables like ‘%slow_query_log%‘;
# 開啟
set global slow_query_log=1
# 查看記錄sql的閾值時間
show variables like ‘long_query_time%‘;
# 設(shè)置閾值時間
set global long_query_time=3;
show profile
# 查看是否支持
show variables like ‘profiling‘
# 開啟
set profiling=on
?
# 查看結(jié)果
show profiles;
show profile cpu,block io from query [問題sql的query_id];
六、MySQL鎖
原文:https://www.cnblogs.com/yangenyu/p/11604262.html
總結(jié)
以上是生活随笔為你收集整理的mysql高级笔记_MySQL高级部分笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库技术基本操作_MySQL
- 下一篇: python mysql example