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