存儲引擎:數據採用不一樣的技術存儲在文件(或內存)中,不一樣的技術擁有不一樣的存儲機制、索引技巧、經過選取不一樣的技術獲取獲取不一樣的功能,從而改善應用的總體功能mysql
介紹:sql
1.InnoDB支持事務,具備的特色:行級鎖設計、支持外鍵、非鎖定讀等等
2.InnoDB經過MVCC來得到高併發性,而且實現了SQL標準的4個隔離級別
3.InnoDB將數據存放在邏輯表空間中,表被單被存放在獨立的ibd文件中
4.InnoDB採用彙集的方式,把每張表的存儲按照主鍵的順序存放,若是沒有顯式指定主鍵,會爲每一行生成一個6字節的ROWID做爲主鍵
介紹數據結構
1.不支持事務和外鍵、支持表鎖和全文索引
2.存儲引擎表由MYD(存儲數據)和MYI(存儲索引)組成
介紹併發
1.將數據存放在內存中,適用於臨時存儲,默認使用哈希索引
2.速度很是快,但只支持表鎖,不支持TEXT和BLOB數據類型
區別高併發
功能特性 | InnoDB | MySIAM | Memory |
---|---|---|---|
事務 | 支持 | ||
鎖 | Row | Table | Table |
MVCC | 支持 | ||
BT_index | 支持 | 支持 | 支持 |
Clustered_Index | 支持 | ||
Hash_Index | 支持 | 支持 | |
Full_Index | 支持 | 支持 | |
Index_Cache | 支持 | 支持 | 支持 |
Data_Cache | 支持 | 支持 | |
F_Key | 支持 |
索引的優勢:簡單來講就是加快"查詢"
索引的缺點:性能
1.下降表的更新效率(由於索引表也須要更新)
2.會額外佔用磁盤空間
若是數據量很是大的狀況下建立索引會致使阻塞等問題
主鍵索引:數據列不容許重複,不容許爲NULL
.一個表只能有一個主鍵優化
NULL
值,一個表容許多個列建立惟一索引NULL
值非聚簇索引:也能夠稱之爲輔助索引,一般是經過輔助索引找到聚簇索引而後找到記錄數據,因此在B樹結構中,葉子節點的數據域存放着是聚餐索引搜索引擎
靈魂三問設計
1.爲何不使用二叉樹:"運氣"很差的時候就會致使查詢效率很是低
2.爲何不使用AVL樹:維護成本較高,高度太高會致使查詢效率下降
3.爲何不使用B-Tree樹:非葉子節點存儲數據會致使磁盤IO開銷增大而且內存中不能放着更多的索引
1.索引不會包含有NULL的列
2.使用短索引
3.索引列在查詢時只會使用一次
4.like語句操做注意%的使用
5.不要在列上進行運算
6.不要使用NOT和!=等操做
7.索引創建在重複率低的字段上
8.注意Join操做是主鍵和外鍵數據類型要一致
......指針
Explain命令:能夠幫助咱們查看SQL語句執行效果
重點字段1:key:顯示MySQL實際決定使用的鍵(索引)。若是沒有選擇索引,鍵是NULL
重點字段2:type:性能由差到好
all: 全表掃描,掃描全部的數據行
index:掃描全部的索引節點
range:查詢時可以根據索引作範圍的掃描
index_subquery:在子查詢中,基於除惟一索引以外的索引進行掃描;
unique_subquery:在子查詢中,基於惟一索引進行掃描
index_merge:多重範圍掃描。兩錶鏈接的每一個表的鏈接字段上均有索引存在且索引有序,結果合併在一塊兒。適用於做集合的並、交操做。
ref_or_null:相似REF,只是搜索條件包括:鏈接字段的值能夠爲NULL的狀況
fulltext:全文索引
ref:這也是一種索引訪問,它返回全部匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,因此他應該屬於查找和掃描的混合體
eq_ref:經過索引列,直接引用某1行數據(精確到一行數據中)常見於鏈接查詢中
const, system, null:當mysql能對查詢的部分就行優化,而且轉換成一個常量的時候,它就會使用這種訪問類型了
由於前一篇文章有涉及到,因此這裏就不作過多介紹,這裏想去總結下關於死鎖的狀況
死鎖:指多個事務對同一個資源上的互相佔用;串行化條件下以及表鎖是不會發生死鎖現象的
關於非事務中會加鎖嗎?
1.手動加鎖:for update
2.自動加鎖:create/insert/update操做