MySQL面試複習2

1.存儲引擎

存儲引擎:數據採用不一樣的技術存儲在文件(或內存)中,不一樣的技術擁有不一樣的存儲機制、索引技巧、經過選取不一樣的技術獲取獲取不一樣的功能,從而改善應用的總體功能mysql

1-1.INNODB存儲引擎

介紹sql

1.InnoDB支持事務,具備的特色:行級鎖設計、支持外鍵、非鎖定讀等等
2.InnoDB經過MVCC來得到高併發性,而且實現了SQL標準的4個隔離級別
3.InnoDB將數據存放在邏輯表空間中,表被單被存放在獨立的ibd文件中
4.InnoDB採用彙集的方式,把每張表的存儲按照主鍵的順序存放,若是沒有顯式指定主鍵,會爲每一行生成一個6字節的ROWID做爲主鍵
  • 應用場景:高併發數據一致性、更新和刪除操做比較多,事務回滾和提交

1-2.MyISAM存儲引擎

介紹數據結構

1.不支持事務和外鍵、支持表鎖和全文索引
2.存儲引擎表由MYD(存儲數據)和MYI(存儲索引)組成
  • 應用場景:讀操做較多

1-3.Memory存儲引擎

介紹併發

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 支持

2.索引

索引的優勢:簡單來講就是加快"查詢"
索引的缺點性能

1.下降表的更新效率(由於索引表也須要更新)
2.會額外佔用磁盤空間
若是數據量很是大的狀況下建立索引會致使阻塞等問題

2.1索引方法

  • B-Tree:大部分存儲引擎都會使用B-Tree進行存儲數據而加快數據的速度(由於不須要進行全表掃描)
  • Hash:基於hash表去存儲表數據的,將字段進行hash後生成的哈希碼存放在hash表中做爲Key.Value值是指向該記錄的指針

2.2索引類型

  • 聚簇索引:表數據按照索引的順序來存儲的,也就是說索引順序和記錄的物理順序一致,一張表一般只會有一個聚簇索引,由於物理順序只能一種(相對於InnoDB來講:葉節點存儲真實數據行)
  • 非聚簇索引:表數據存儲順序和索引順序無關(相對於MyISAM來講:葉節點存儲的是指向數據頁的邏輯指針)
  • 主鍵索引:數據列不容許重複,不容許爲NULL.一個表只能有一個主鍵優化

    • InnoDB:主鍵索引其實根據B+Tree數據結構組織成的是聚簇索引
    • MyISAM:主鍵索引也是根據B+Tree數據結構組織成的可是非聚簇索引
  • 惟一索引:數據列不容許重複,容許爲NULL值,一個表容許多個列建立惟一索引
  • 普通索引:基本的索引類型,沒有惟一性的限制,容許爲NULL
  • 聯合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併(多個單列索引)
  • 哈希索引:底層使用hash表數據結構組織的存儲表數據(InnoDB中自適應哈希加快字典類型的單記錄查詢)
  • 全文索引:用於查找文本中的關鍵字,更相似於搜索引擎(MyISAM表中仍是使用B-Tree組織的)

非聚簇索引:也能夠稱之爲輔助索引,一般是經過輔助索引找到聚簇索引而後找到記錄數據,因此在B樹結構中,葉子節點的數據域存放着是聚餐索引搜索引擎

靈魂三問設計

1.爲何不使用二叉樹:"運氣"很差的時候就會致使查詢效率很是低
2.爲何不使用AVL樹:維護成本較高,高度太高會致使查詢效率下降
3.爲何不使用B-Tree樹:非葉子節點存儲數據會致使磁盤IO開銷增大而且內存中不能放着更多的索引

2-3.索引技巧

1.索引不會包含有NULL的列
2.使用短索引
3.索引列在查詢時只會使用一次
4.like語句操做注意%的使用
5.不要在列上進行運算
6.不要使用NOT和!=等操做
7.索引創建在重複率低的字段上
8.注意Join操做是主鍵和外鍵數據類型要一致
......指針

2-4.索引分析

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能對查詢的部分就行優化,而且轉換成一個常量的時候,它就會使用這種訪問類型了

3.鎖

由於前一篇文章有涉及到,因此這裏就不作過多介紹,這裏想去總結下關於死鎖的狀況
死鎖:指多個事務對同一個資源上的互相佔用;串行化條件下以及表鎖是不會發生死鎖現象的
關於非事務中會加鎖嗎?

1.手動加鎖:for update
2.自動加鎖:create/insert/update操做

4.優化

相關文章
相關標籤/搜索