mysql深入學習02

1.各存儲引擎特點

1.1存儲引擎介紹
  • 插拔式的插件方式
  • 存儲引擎是指定在表上面的
  • 不管使用什么存儲引擎莫杈,都會在數據區(qū)產生一個frm文件(表結構定義描述文件)
1.2存儲引擎特點總結

1.2.1MyISAM與InnoDB的索引差異

  • csv存儲引擎

    特點:
    不能定義沒有索引梧疲、列定義必須為NOT NULL、不能設置自增列
    不適用大表或者數據的在線處理
    CSV數據的存儲用,隔開碴卧,可直接編輯CSV文件進行數據的編排
    數據安全性低
    注:編輯之后,要生效使用flush table XXX 命令
    應用場景:
    數據的快速導出導入
    表格直接轉換成CSV

  • archive存儲引擎

    壓縮協議進行數據的存儲數據存儲為ARZ文件格式
    特點:
    只支持insert和select兩種操作
    只允許自增ID列建立索引
    行級鎖
    不支持事務
    數據占用磁盤少
    應用場景:
    日志系統
    大量的設備數據采集

  • myisam:

    Mysql5.5版本之前的默認存儲引擎漾唉,較多的系統表也還是使用這個存儲引擎炬称,系統臨時表也會用到Myisam存儲引擎
    特點:

    a伞广,select count(*) from table 無需進行數據的掃描
    b,數據(MYD)和索引(MYI)分開存儲
    c疼电,表級鎖
    d嚼锄,不支持事務

+Innodb

Mysql5.5及以后版本的默認存儲引擎
優(yōu)點:

Its DML operations follow the ACID model [事務ACID]
Row-level locking[行級鎖]
InnoDB tables arrange your data on disk to optimize queries based on primary keys[聚集索引(主鍵索引)方式進行數據存儲]
To maintain data integrity, InnoDB supports FOREIGN KEY constraints[支持外鍵關系保證數據完整性]


2.mysql 體系結構

image.png

Client Connectors
接入方 支持協議很多
Management Serveices & Utilities
系統管理和控制工具,mysqldump蔽豺、 mysql復制集群区丑、分區(qū)管理等
Connection Pool
連接池:管理緩沖用戶連接、用戶名修陡、密碼沧侥、權限校驗、線程處理等需要緩存的需求
SQL Interface
SQL接口:接受用戶的SQL命令魄鸦,并且返回用戶需要查詢的結果
Parser
解析器宴杀,SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的
Optimizer
查詢優(yōu)化器拾因,SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進行優(yōu)化
Cache和Buffer(高速緩存區(qū))
查詢緩存旺罢,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據
pluggable storage Engines
插件式存儲引擎绢记。存儲引擎是MySql中具體的與文件打交道的子系統
file system
文件系統扁达,數據、日志(redo蠢熄,undo)跪解、索引、錯誤日志护赊、查詢記錄惠遏、慢查詢等

3.查詢路徑

image.png
  1. mysql 客戶端/服務端通信

Mysql客戶端與服務端的通信方式是“半雙工”;
客戶端一旦開始發(fā)送消息骏啰,另一端要接收完整個消息才能響應节吮。

客戶端一旦開始接收數據沒法停下來發(fā)送指令。

查詢狀態(tài):對于一個mysql連接判耕,或者說一個線程透绩,時刻都有一個狀態(tài)來標識這個連接正在做什么
查看命令 show full processlist / show processlist
https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html (狀態(tài)全集)

狀態(tài)代碼 狀態(tài)含義
Sleep 線程正在等待客戶端發(fā)送數據
Query 連接線程正在執(zhí)行查詢
Locked 線程正在等待表鎖的釋放
Sorting result 線程正在對結果進行排序
Sending data 向請求端返回數據

?可通過kill {id}的方式進行連接的殺掉

  1. 查詢緩存

工作原理
緩存SELECT操作的結果集和SQL語句;
新的SELECT語句壁熄,先去查詢緩存帚豪,判斷是否存在可用的記錄集;
判斷標準
與緩存的SQL語句草丧,是否完全一樣狸臣,區(qū)分大小寫 (簡單認為存儲了一個key-value結構,key為sql昌执,value為sql查詢結果集)

show status like 'Qcache%' ;  //命令可查看緩存情況

query_cache_type
值:0 -– 不啟用查詢緩存烛亦,默認值诈泼;
值:1 -– 啟用查詢緩存,只要符合查詢緩存的要求,客戶端的查詢語句和記錄集
都可以緩存起來,供其他客戶端使用凤类,加上 SQL_NO_CACHE將不緩存
值:2 -– 啟用查詢緩存,只要查詢語句中添加了參數:SQL_CACHE瓮孙,且符合查詢
緩存的要求,客戶端的查詢語句和記錄集选脊,則可以緩存起來杭抠,供其他客戶端使用
query_cache_size
允許設置query_cache_size的值最小為40K,默認1M知牌,推薦設置 為:64M/128M祈争;
query_cache_limit
限制查詢緩存區(qū)最大能緩存的查詢記錄集斤程,默認設置為1M

不會緩存的情況
?1.當查詢語句中有一些不確定的數據時角寸,則不會被緩存。如包含函數NOW()忿墅,
CURRENT_DATE()等類似的函數扁藕,或者用戶自定義的函數,存儲函數疚脐,用戶變
量等都不會被緩存
?2.當查詢的結果大于query_cache_limit設置的值時亿柑,結果不會被緩存
?3.對于InnoDB引擎來說,當一個語句在事務中修改了某個表棍弄,那么在這個事務提交之前望薄,所有與這個表相關的查詢都無法被緩存。因此長時間執(zhí)行事務呼畸,會大大降低緩存命中率
?4.查詢的表是系統表
?5.查詢語句不涉及到表

mysql默認關閉查詢緩存

緩存的弊端:
1.在查詢之前必須先檢查是否命中緩存,浪費計算資源
2.如果這個查詢可以被緩存痕支,那么執(zhí)行完成后,MySQL發(fā)現查詢緩存中沒有這
個查詢蛮原,則會將結果存入查詢緩存卧须,這會帶來額外的系統消耗
3.針對表進行寫入或更新數據時,將對應表的所有緩存都設置失效儒陨。
4.如果查詢緩存很大或者碎片很多時花嘶,這個操作可能帶來很大的系統消耗

使用場景:
以讀為主的業(yè)務,數據生成之后就不常改變的業(yè)務
比如門戶類蹦漠、新聞類椭员、報表類、論壇類等

  1. 查詢優(yōu)化處理

優(yōu)化的3個階段

  • 解析sql
    ?通過lex詞法分析,yacc語法分析將sql語句解析成解析樹
  • 預處理階段
    ?根據mysql的語法的規(guī)則進一步檢查解析樹的合法性笛园,如:檢查數據的表
    和列是否存在隘击,解析名字和別名的設置容劳。還會進行權限的驗證
  • 查詢優(yōu)化器
    ?優(yōu)化器的主要作用就是找到最優(yōu)的執(zhí)行計劃

查詢優(yōu)化器的優(yōu)化方法

  • 使用等價變化規(guī)則
    5 = 5 and a > 5 改寫成 a > 5
    a < b and a = 5 改寫成 b > 5 and a = 5
    基于聯合索引,調整條件位置等
  • 優(yōu)化count 闸度、min竭贩、max等函數
    min函數只需找索引最左邊
    max函數只需找索引最右邊
    myisam引擎count(*)
  • 覆蓋索引掃描
  • 子查詢優(yōu)化
  • 提前終止查詢
    用了limit關鍵字或者使用不存在的條件
  • IN的優(yōu)化
    先進性排序,再采用二分查找的方式

Mysql的查詢優(yōu)化器是基于成本計算的原則莺禁。他會嘗試各種執(zhí)行計劃留量。數據抽樣的方式進行試驗(隨機的讀取一個4K的數據塊進行分析)

執(zhí)行優(yōu)化
explain select * from user

image.png

id
select查詢的序列號,標識執(zhí)行的順序
1哟冬、id相同楼熄,執(zhí)行順序由上至下
2、id不同浩峡,如果是子查詢可岂,id的序號會遞增,id值越大優(yōu)先級越高翰灾,越先被執(zhí)行
3缕粹、id相同又不同即兩種情況同時存在,id如果相同纸淮,可以認為是一組平斩,從上往下順序
執(zhí)行;在所有組中咽块,id值越大绘面,優(yōu)先級越高,越先執(zhí)行

select_type
查詢的類型侈沪,主要是用于區(qū)分普通查詢揭璃、聯合查詢、子查詢等
SIMPLE:簡單的select查詢亭罪,查詢中不包含子查詢或者union
PRIMARY:查詢中包含子部分瘦馍,最外層查詢則被標記為primary
SUBQUERY/MATERIALIZED:SUBQUERY表示在select 或 where列表中包含了子查詢
MATERIALIZED表示where 后面in條件的子查詢
UNION:若第二個select出現在union之后,則被標記為union皆撩;
UNION RESULT:從union表獲取結果的select

table
查詢涉及到的表
直接顯示表名或者表的別名
<unionM,N> 由ID為M,N 查詢union產生的結果
<subqueryN> 由ID為N查詢生產的結

type
訪問類型扣墩,sql查詢優(yōu)化中一個很重要的指標,結果值從好到壞依次是:
system > const > eq_ref > ref > range > index > ALL
system:表只有一行記錄(等于系統表)扛吞,const類型的特例呻惕,基本不會出現,可以忽略不計
const:表示通過索引一次就找到了滥比,const用于比較primary key 或者 unique索引
eq_ref:唯一索引掃描亚脆,對于每個索引鍵,表中只有一條記錄與之匹配盲泛。常見于主鍵 或 唯一索引掃描
ref:非唯一性索引掃描濒持,返回匹配某個單獨值的所有行键耕,本質是也是一種索引訪問
range:只檢索給定范圍的行,使用一個索引來選擇行
index:Full Index Scan柑营,索引全表掃描屈雄,把索引從頭到尾掃一遍
ALL:Full Table Scan,遍歷全表以找到匹配的行

possible_keys
查詢過程中有可能用到的索引
key
實際使用的索引官套,如果為NULL酒奶,則沒有使用索引 rows
根據表統計信息或者索引選用情況,大致估算出找到所需的記錄所需要讀取的行

filtered
它指返回結果的行占需要讀到的行(rows列的值)的百分比
表示返回結果的行數占需讀取行數的百分比奶赔,filtered的值越大越好

extra---十分重要的額外信息
1惋嚎、Using filesort :
mysql對數據使用一個外部的文件內容進行了排序,而不是按照表內的索引進行排序讀取
2站刑、Using temporary:
使用臨時表保存中間結果另伍,也就是說mysql在對查詢結果排序時使用了臨時表,常見于order by 或 group by
3绞旅、Using index:
表示相應的select操作中使用了覆蓋索引(Covering Index)摆尝,避免了訪問表的數據行,效率高
4玻靡、Using where :使用了where過濾條件
5结榄、select tables optimized away:
基于索引優(yōu)化MIN/MAX操作或者MyISAM存儲引擎優(yōu)化COUNT(*)操作,不必等到執(zhí)行階段在進行計算囤捻,查詢執(zhí)行計劃生成的階段即可完成優(yōu)化

  1. 查詢執(zhí)行引擎
    調用插件式的存儲引擎的原子API的功能進行執(zhí)行計劃的執(zhí)行

  2. 返回客戶端

1、有需要做緩存的邻寿,執(zhí)行緩存操作
2蝎土、增量的返回結果:
開始生成第一條結果時,mysql就開始往請求方逐步返回數據
好處: mysql服務器無須保存過多的數據,浪費內存
???用戶體驗好绣否,馬上就拿到了數據

定位慢查詢sql

  1. 業(yè)務驅動--業(yè)務人員
  2. 測試驅動--測試人員誊涯,比如壓力測試
  3. 慢查詢日志--開啟數據庫慢查詢日志

慢查詢日志配置

show variables like 'slow_query_log'
set global slow_query_log = on
set global slow_query_log_file = '/var/lib/mysql/gupaoedu-slow.log'
set global log_queries_not_using_indexes = on set global long_query_time = 0.1 (秒)

慢查詢分析工具
mysqldumpslow -t 10 -s at /var/lib/mysql/慢查詢日志.log
其他工具:mysqlsla、pt-query-digest

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蒜撮,一起剝皮案震驚了整個濱河市暴构,隨后出現的幾起案子,更是在濱河造成了極大的恐慌段磨,老刑警劉巖取逾,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異苹支,居然都是意外死亡砾隅,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門债蜜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴埂,“玉大人究反,你說我怎么就攤上這事∪迓澹” “怎么了精耐?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琅锻。 經常有香客問我黍氮,道長,這世上最難降的妖魔是什么浅浮? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任沫浆,我火速辦了婚禮,結果婚禮上滚秩,老公的妹妹穿的比我還像新娘专执。我一直安慰自己,他們只是感情好郁油,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布本股。 她就那樣靜靜地躺著,像睡著了一般桐腌。 火紅的嫁衣襯著肌膚如雪拄显。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天案站,我揣著相機與錄音躬审,去河邊找鬼。 笑死蟆盐,一個胖子當著我的面吹牛承边,可吹牛的內容都是我干的。 我是一名探鬼主播石挂,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼博助,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痹愚?” 一聲冷哼從身側響起富岳,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拯腮,沒想到半個月后窖式,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡疾瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年脖镀,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜒灰,死狀恐怖弦蹂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情强窖,我是刑警寧澤凸椿,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站翅溺,受9級特大地震影響脑漫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咙崎,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一优幸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褪猛,春花似錦网杆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笑旺,卻和暖如春昼浦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筒主。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工关噪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人物舒。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓色洞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冠胯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349