Mysql 經典知識點

2021-08-30 02:43:56 字數 4230 閱讀 4714

表鎖(table lock)

對整張表加讀寫鎖,讀鎖可以之間不會相互阻塞,但是當有寫鎖時,任何使用者都不可以獲取讀鎖

並且寫鎖比讀鎖的優先順序高,乙個寫的命令可能被插入讀命令之前.

行級鎖(row lock)

行級鎖對每一行新增讀寫鎖,這樣可以實現最大程度地支援併發處理,但是也有最大的鎖開銷.

乙個事務時最小單元,並且要麼提交成功,否則失敗回滾,不可能只執行其中一部分操作

關注資料的可見性,中間狀態的資料對外部不可見,只有最初狀態和最終狀態的資料對外可見

在乙個事務對資料操作時,別的事務不能干擾這個操作

一旦事務提交,則其做的修改就永久儲存到資料庫

read uncommitted(未提交讀)

事務中的修改,即使沒有提交,對其他事務也是可見的,也被稱為髒讀

read committed(提交讀)

乙個事務從開始修改到提交所做的修改其他事務都看不見,也成為不可重複讀

repeatable read(可重複讀)

可重複讀解決了髒讀的問題,該級別保證了乙個事務多次讀取同樣的資料返回結果相同,但也會產生另乙個問題幻讀

seializable(可序列化)

可序列化是最高的隔離級別.該級別會在每一行都加鎖,所以會導致大量的的超時和鎖爭用問題.

可以當作是行級鎖的乙個變種,mvcc是通過儲存資料時的快照來實現的,所以不管需要執行多長時間,每個事務看到的資料都是相同的.根據事務開始的時間不同,每個事務對應一張表,同一時刻看到的資料可能是不同的.

不同的資料庫引擎實現不同的mvcc,典型的有樂觀併發控制悲觀併發控制

mvcc只在read committed 和 repeatable read這兩個級別下工作

通過為每一行後面增加兩個隱藏列來實現mvcc,分別是建立時間和過期時間

**注意:**這裡的時間指的是系統的版號,可以說就是每個事務有不同的版號.

在可重複讀級別下,不同命令下,mvcc具體的操作:

select

innodb會根據下面兩點檢查行:

insert

innodb為新插入的行的建立時間中儲存當前版本號

delete

innodb為刪除的每行的刪除時間中儲存當前版本號

update

innodb為修改的行儲存當前版本號,並且修改該行原來的過期時間為當前版本號

優缺點**優點:**這樣查詢起來基本不需要新增鎖.

**缺點:**每一行都新增了兩個列,增加額外的儲存空間.

mysql預設的事務型引擎.

innodb的資料儲存在表空間(tablespace)中,表空間由innodb管理的一系列資料檔案組成,

innodb採用mvcc來實現高併發,並且使用四個隔離級別.

innodb表是基於聚簇索引建立的.

innodb內部還有很多優化,包括從可**性預讀,自適應雜湊索引,插入快取區等.

myisam提供大量特性,包括全文索引,壓縮,空間函式等,不過不支援事務和行級鎖.有乙個缺陷是崩潰後無法安全恢復.

myisam會將表儲存在資料檔案和索引檔案,分別以.myd和.myi為副檔名.可以包含動態和靜態的行.

特性加鎖與併發

myisam對錶加鎖,而不是行.讀取時加共享鎖,寫入時加排他鎖.在表有讀取查詢的同時,也可以往表中插入資料,這也叫併發插入.

修復可以手工和自動執行檢查和修復操作. 修復與事務恢復以及崩潰恢復是不同的.

索引特性

即使是blob和text欄位,也支援基於其前400個字元建立索引.同時也支援全文索引.

延遲更新索引鍵

可以通過指定delay_key_write選項使用該特性.

每次修改後,不會立即將修改的索引資料寫入磁碟,而是放入記憶體中的鍵緩衝區.只有在清理鍵快取區或者關閉表的時候才會寫入.

如果資料庫崩潰會造成索引損壞,需要執行修復操作. 可以全域性設定也可以對單錶設定.

壓縮表如果在表建立和匯入資料後,不會做資料的修改操作,可以使用myisam壓縮表.

可以使用myisampack對myisam表進行壓縮,如果要修改資料,可以解壓->修改資料->壓縮.

壓縮表可以極大地減少磁碟空間占用,因此可以減少磁碟i/o.壓縮表也支援索引,不過索引只是可讀的.

archive 引擎

archive只支援select和insert操作.

archive引擎會快取所有寫並利用zlib對插入進行壓縮,所以會有更低的磁碟i/o,但每次select就會全盤掃瞄.

archive引擎支援行級鎖和專用的快取區,所以可以實現高併發的插入.在查詢時,會阻止其他select語句進行查詢,避免幻讀.該引擎在插入時也會對讀操作是不可見的,但這只是模仿mvcc模式,並不時事務型引擎.

適用場景:

適合用作日誌和資料採集應用

blackhole 引擎

blackhole引擎並沒有儲存機制,會丟棄所有資料,但是伺服器會記錄blackhole表的日誌.

適用場景:

可以用於複製資料到備庫,或者簡單地記錄到日誌

csv 引擎

csv引擎可以將普通的csv檔案作為mysql表來處理.但這種表不支援索引.

適用場景:

可以作為資料轉換的中間表.提供將csv檔案中的資料轉為mysql表中資料.

federated 引擎

訪問其他mysql服務的乙個**,會建立乙個到遠端mysql伺服器的客戶端連線,並將查詢傳輸到遠端伺服器執行,然後提取或者傳送需要的資料.

memory 引擎

memory表所有的資料都儲存在記憶體中,所以不需要進行磁碟i/o,因此比myisam引擎快乙個數量級.

如果你需要快速訪問資料,並且這些資料不需要修改,重啟後丟失也沒有關係,那麼你可以選擇使用memory引擎.

memory引擎在重啟後,表結構並不丟失,只會丟失資料.

特性:

ndb 集群引擎

mysql伺服器 ndb集群儲存引擎 以及分布式 share-nothing的 容災的 高可用的 ndb資料庫的組合,被稱為mysql集群.

oltp類引擎

面向列的儲存引擎

infobright引擎是最有名的面向列的儲存引擎.該引擎是為了資料分析和資料倉儲應用設計的.

索引分為聚簇索引非聚簇索引,聚簇索引的索引順序就是物理順序,非聚簇索引的索引順序與物理順序無關.就好像一本字典,你去找"劉"這個字,你通過l查詢就是聚簇索引.如果你直接通過"劉"的頁碼找到這個字就是非聚簇索引.

下面是聚簇索引和非聚簇索引需要設定的列的區別:

注意:

聚簇索引在乙個表中是唯一的.如果你建立了主鍵,那麼會預設將聚簇索引設定為主鍵,如果你不想讓主鍵是聚簇索引,那麼就在主鍵設定之前分配好聚簇索引.

儲存引擎以b-tree資料結構儲存索引,b-tree索引列是順序儲存的,所以很適合範圍查詢.b-tree索引適用於全值匹配 匹配最左字首 匹配列字首 匹配範圍值 精確匹配一列並範圍匹配另一列 只訪問索引的查詢

限制:

基於雜湊表實現索引功能.對於每一行資料,索引列都會計算出乙個雜湊碼,雜湊碼是乙個比較小的數值,並且不同的鍵值對應的雜湊碼不同.

mysql中只有memory引擎顯示支援雜湊索引,也是預設索引型別.

限制:

innodb引擎有乙個功能叫"自適應雜湊索引",當innodb發現某些索引列經常使用,那麼會基於b-tree索引基礎上再建立乙個雜湊索引.

myisam表支援空間索引,可以用作地理資料儲存.空間索引會根據所有維度進行查詢.

檢視是虛擬的表,與包含資料的表不同,檢視只包含對資料的查詢,不包含任何列或資料.檢視可以直接當作表操作.

個人理解,檢視就相當於把操作封裝起來,如果經常使用乙個查詢,就可以設定為檢視.

對於某些檢視比如未使用聯結子查詢分組聚集函式distinct union等,是可以對其更新的,對檢視的更新將對基表進行更新;但是檢視主要用於簡化檢索,保護資料,並不用於更新,而且大部分檢視都不可以更新。

本書參考《高效能mysql>> (第三版)

Redis經典知識點

redis是什麼?redis是乙個開源的,使用c語言編寫的,支援網路互動的,可基於記憶體也可持久化的key value儲存系統。什麼是redis持久化?redis有哪幾種持久化方式?優缺點是什麼?使用redis有哪些好處?資料儲存在記憶體中,讀寫速度快 支援的資料型別資源豐富 支援事務,操作都是原子...

mysql常用知識點 mysql 常用知識點。

mysql u root p show databases show tables select from abc order by id limit 0,10 create database bbb exit mysqldump u root p game home backup.sql mysq...

二級mysql知識點 Mysql 知識點

1.死鎖回滾策略 死鎖發生時mysql會選擇行數少的事務進行回滾 2.鎖型別 共享鎖,排他鎖 行級鎖 innob record lock 鎖定單條記錄 gap lock 鎖定乙個範圍的記錄 但不包括記錄本身 next key lock 鎖定乙個範圍的記錄 並且包 含記錄本身 這是預設的鎖型別 更新操...