鏈接池組件、管理服務和工具組件、SQL接口組件、查詢分析器組件、優化器組件、緩衝組件、插件式存儲引擎、物理文件;
一、鏈接層:主要完成一些相似於鏈接處理,受權認證及相關的方案;
二、服務層:主要完成大多數核心服務功能;
三、引擎層:負責MySQL中數據的存儲和提取,服務器經過API與存儲引擎進行通訊;
注:儲存引擎式基於表的,而不是數據庫的;css
InnoDB 和 MyISAM區別:
一、InnoDB支持主外鍵、事務;
二、InnoDB是行鎖,操做時候只鎖一行數據,適合高併發;MyISAM是表索;
三、InnoDB不只緩存索引,還緩存真實數據;MyISAM只緩存索引;
四、InnoDB須要表空間大;
五、InnoDB關注事務,MyISAM關注性能(查);html
問:執行時間長,等待時間長
多是SQL語句太次,索引失效,關聯查詢太多join,服務器調優及參數設置(緩衝池)
SQL執行順序:mysql
JOIN詳解:
最後兩個因爲MySQL不支持FULL OUTER JOIN,因此用 UNION 鏈接,即1和2的語句進行UNION獲得6,3和4的語句進行UNION獲得7。web
索引:排好序的快速查找數據結構;
優勢:提升數據檢索的效率,下降數據排序的成本;
缺點:會下降更新表的速度;算法
單值索引:一個索引只包含單個列,一個表能夠由多個單值索引;
惟一索引:索引列的值必須惟一,容許有空值;
複合索引:即一個索引包含多個列;sql
索引結構:
BTree索引,Hash索引,full-text全文索引,R-Tree索引;數據庫
B+樹與B樹的不一樣在於:
(1)全部關鍵字存儲在葉子節點,非葉子節點不存儲真正的data
(2)爲全部葉子節點增長了一個鏈指針緩存
下圖是BTree索引數據結構
服務器
索引性能分析:
Explain(執行計劃):
使用:EXPLAIN + sql語句;
做用:
一、表的讀取順序;
二、數據讀取操做的操做類型;
三、哪些索引可使用;
四、那些索引被實際使用;
五、表之間的引用;
六、每張表有多少行被優化器查詢;
id
select 查詢的序列號,包含一組數字,表示查詢中執行select子句或操做表的順序;
有三種狀況:
一、id相同,執行順序由上至下;
二、id不一樣,若是是子查詢,id的序號會遞增,id值越大優先級越高,先被執行 ;
三、id有相同,有不一樣,相同的能夠認爲是一組,從上往下順序執行;在全部組中,id值越大,優先級越高,先被執行;(table 列中的 derived 的意思是衍生,由 id 衍生的)markdown
select_type
table
顯示這一行數據是哪一個表的;
type
性能高低從上到下的順序;
possible_keys
顯示可能應用在這張表中的索引,能夠是多個;
查詢涉及到的字段上若存在索引,則被列出,但不必定被使用;
key
實際使用到的索引,null表明沒使用索引。
查詢若使用覆蓋索引,則該索引僅出如今key列表中;
key_len
表示索引中使用的字節數,越小越好,顯示的值爲索引字段的最大可能長度,並不是實際使用長度。
ref
顯示索引的哪一列被使用了,最好是常量;
rows
根據表統計信息及索引選用狀況,大體估計出找到所需的記錄所須要讀取的行數;
extra
包含不適合在其餘列展現的但重要的額外信息
usingwhere 使用where語句;
usingbuffer 使用緩衝池;
若是查詢的兩個表大小至關,那麼用in和exists差異不大。
若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
因此不管那個表大,用not exists都比not in要快。not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
Join鏈接索引分析
單表分析
例:select id from A where c1 = 1 and c2 > 1 order by v1 desc limit 1;
創建聯合索引(c1,c2,v1),但explain時候發現 type 是range,extra中使用using filesort,這須要優化;
產生緣由:按照BTree索引工做原理,先排序c1,若是c1相同,排序c2,c2相同在排序v1,當c2字段在聯合索引中處於中間位置,由於c2 > 1條件是一個範圍值(range),MySQL沒法利用索引在對後面的v1部分進行索引。因此創建(c1,v1)解決這個問題。
雙表分析
左鏈接加在右表的索引,右鏈接加在左表的索引;
Left Join 條件用於肯定如何從右表搜索行,左邊數據必定有,因此右邊數據必定要建索引。
三表分析
建索引和雙表的原理相同;
總結
儘量減小Join語句的NestedLoop的循環總次數,永遠用小結果集驅動大的結果集;
優先優化NestedLoop的內層循環;
保證Join語句中被驅動表上Join條件字段已經被索引;
一、最好全值匹配;
二、最左前綴法則:若是索引了多列,查詢從索引的最左前列開始,且不能跳過索引中的列;
三、不在索引列上作任何操做(計算,函數,類型轉換),會致使索引時校而轉向全表掃描;
四、存儲引擎不能使用索引中範圍條件右邊的列,即範圍以後全失效;
五、儘可能使用覆蓋索引,只訪問索引的查詢(索引列和查詢列一致),減小selec *;
六、MySQL在使用不等於的時候沒法使用索引會致使全表掃描;
七、is null,is not null 也沒法使用索引;
八、like 以通配符開頭(’%aa‘)索引會失效,變成全表掃描;
九、字符串不加單引號,索引失效;
十、少用 or,用它來鏈接時候會索引失效
覆蓋索引:建索引的列和要查詢的列相同,例如索引列是c1,c2,select 查詢的也是c1,c2;
定值是常量,範圍以後必失效,最終看排序,通常order by 是給個範圍;
group by 分組,分組以前必排序,順序不對會有臨時表產生;
永遠小表驅動大表
in 和 exists 選擇:
Order By 排序
MySQL支持兩種排序,index和fileSort,index效率高,它指MySQL掃描索引自己完成排序。
Order By知足兩種狀況使用index:
一、Order By 語句使用索引最左前列
二、使用where子句與Order By子句條件組合知足索引最左前列
若是不在索引列上,fileSort有兩種算法,4.1版本以前雙路排序,進行兩次IO;以後單路排序,進行一次IO;
Order By時不要select *,只查詢所須要的字段;當兩種算法的數據超出sort_buffer的容量會建立tmp文件進行合併運算,致使屢次IO,因此須要嘗試提升sort_buffer_size 和
max_length_for_sort_ size。
爲排序使用索引,MySQL能爲排序與查詢使用相同的索引
一、觀察,查看慢SQL狀況;
二、開啓查詢日誌,設置閥值;
三、explain 分析;
四、show profile 查看執行細節和生命週期狀況
五、dba 進行參數調優
慢查詢日誌
響應時間超過long_query_tine的SQL,被記錄到慢查詢日誌中。
Show Profile
是MySQL提供能夠用來分析當前會話中語句執行的資源狀況,能夠用於SQL的調優的測量。
默認關閉,並保存最近15次結果;
converting HEAP to MyISAM 查詢結果太大,內存不夠用了往磁盤上搬;
Creating tmp table 建立臨時表,拷貝數據到臨時表,用完再刪除;
Copying to tmp table on disk 把內存中臨時表複製到磁盤,危險!
locked
全局查詢日誌
不能夠在生產環境中開啓這個功能。
分類能夠分爲讀鎖(共享鎖)和寫鎖;表鎖和行鎖;
表鎖:偏向MyISAM存儲引擎,開銷小,加鎖快,併發度低;
加鎖:lock table tablename read,tablename2 write;解鎖:unlock tables;
查看哪些表被鎖了 show open tables;
加讀鎖
加寫鎖
MyISAM在執行查詢語句前,會自動給涉及的全部表加讀鎖,在執行增刪改前,會自動給涉及的表加寫鎖。
一、對MyISAM表的操做(加讀鎖),不會阻塞其餘進程對同一表的讀請求,但會阻塞對同一表的寫請求,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。
二、對MyISAM表的操做(加寫鎖),會阻塞其餘進程對同一表的讀和寫操做,只有當寫鎖釋放後,纔會執行其餘進程的讀寫操做。
分析表鎖定
show status likes ‘table%’;
Table_locks_immediate:產生表級鎖定的次數;
Table_locks_waited:出現表級鎖定爭用而發生等待的次數,不能當即獲取鎖的次數,每等待一次鎖值加1;
MyISAM的讀寫鎖調度是寫優先,因此不適合作寫爲主表的引擎。
行鎖:偏向InnoDB存儲引擎,開銷大,會出現死鎖,鎖的粒度最小,發生鎖衝突的機率最低,併發度高。
InnoDB與MyISAM最大不一樣是InnoDB支持事務,而且採用行級鎖;
事務隔離級別:未提交讀,已提交讀,可重複度,可序列化。MySQL默認是可重複讀。
無索引,行鎖變表鎖
當咱們使用範圍條件而不是相等條件檢索數據,並請求共享排他鎖時,InnoDB會給符合條件的已有數據記錄的索引項加鎖;對於鍵值在條件範圍內但不存在的記錄,叫作間隙;InnoDB也會對這個間隙加鎖。
複製的基本原理
slave會從master讀取binlog來進行數據同步。
MySQL複製過程分爲三步:
一、master將改變記錄到二進制日誌(binary log);
二、slave將master的binary log events 拷貝到它的中繼日誌(relay log);
三、slave重作中繼日誌的時間,將改變應用到本身的數據庫中,MySQL複製是異步的且串行化;
每一個slave只有一個master,只能有一個惟一的服務器ID,每一個master能夠有多個salve;
DML
DML(data manipulation language)數據操縱語言,好比SELECT、UPDATE、INSERT、DELETE;
DDL
DDL(data definition language)數據庫定義語言,CREATE、ALTER、DROP等;
DCL
DCL(Data Control Language)數據庫控制語言,grant,deny,revoke等;
MyISAM使用B-Tree實現主鍵索引、惟一索引和非主鍵索引。
InnoDB中非主鍵索引使用的是B-Tree數據結構,而主鍵索引使用的是B+Tree。
二級索引
mysql中每一個表都有一個聚簇索引(clustered index ),除此以外的表上的每一個非聚簇索引都是二級索引,又叫輔助索引(secondary indexes)。
以InnoDB來講,每一個InnoDB表具備一個特殊的索引稱爲彙集索引。若是您的表上定義有主鍵,該主鍵索引是彙集索引。若是你不定義爲您的表的主鍵時,MySQL取第一個惟一索引(unique)並且只含非空列(NOT NULL)做爲主鍵,InnoDB使用它做爲彙集索引。若是沒有這樣的列,InnoDB就本身產生一個這樣的ID值,它有六個字節,並且是隱藏的,使其做爲聚簇索引。