Mysql 學習總結

2022-06-10 16:45:06 字數 3089 閱讀 8184

最直觀的不同就是底層的外掛程式式儲存引擎,可以配置不同的儲存引擎,支援不同的業務特性

儲存引擎

特性innodb儲存引擎

面向oltp(online transaction processing)、行鎖、支援外來鍵、非鎖定讀、預設採用repeaable級別(可重複讀)通過next-keylocking策略避免幻讀、插入緩衝、二次寫、自適應雜湊索引、預讀

myisam儲存引擎

memory儲存引擎

資料存放在記憶體中,表鎖,併發效能差,預設使用雜湊索引

archive儲存引擎

只支援insert和select zlib演算法壓縮1:10,適合儲存歸檔資料如日誌等、行鎖

maria儲存引擎

目的取代myisam、快取資料和索引、行鎖、mvcc

後台執行緒:4個io thread(insert buffer、log、read、write),1個master thread(優先順序最高),1個鎖(lock)監控執行緒,1個錯誤監控執行緒。

loop主線程主要做是: 1s-日誌緩衝重新整理到奧磁碟,合併插入緩衝,重新整理髒頁到磁碟,10s-增加刪除無用undo頁,產生檢查點等

插入緩衝是物理頁的乙個組成部分,用來提高效能,由於b+樹演算法,插入資料時候主鍵索引是順序的,如果非聚集索引(輔助索引),葉子節點無序,索引innodb引入插入緩衝,判斷非聚集索引頁是否在緩衝池中,如果在則直接插入,不在則先放入緩衝區,然後loop會以一定頻率將插入緩衝合併。

儲存引擎: 緩衝池(buffer pool)、重做日誌緩衝池(redo log buffer)以及額外的記憶體池(additional memory pool) 組成。

緩衝池:佔最大塊記憶體,用來存放各種資料的快取包括有索引頁、資料頁、undo頁、插入緩衝、自適應雜湊索引、innodb儲存的鎖資訊、資料字典資訊等。工作方式總是將資料庫檔案按頁(每頁16k)讀取到緩衝池,然後按最近最少使用

(lru)的演算法來保留在緩衝池中的快取資料。如果資料庫檔案需要修改,總是首先修改在快取池中的頁(發生修改後即為髒頁),然後再按照一定的頻率將緩衝池的髒頁重新整理到檔案。

日誌緩衝: 將重做日誌資訊先放倒這個緩衝區中,然後按照一定頻率將其重新整理到重做日誌檔案。

兩次寫:如果寫失敗,可以通過重做日誌恢復,重做日誌中記錄的是對頁的物理操作,如果頁本身損壞,則沒用。提公升可靠性,在應用重做日誌之前,需要乙個頁的副本,當寫入失效發生時候,先通過頁的副本來還原該頁,再進行重做。

恢復資料=頁副本+重做日誌

自適應雜湊索引:對於等值搜尋,innodb儲存引擎會監控表上索引的查詢,如果觀察到建立雜湊索引會帶來效能提公升,則建立雜湊索引,innodb_adaptive_hash_index來啟用或者禁用

對應的檢視命令:

show engine innodb status

show variables

like

'innodb_io_thread%

'show variables

like

'innodb_buffer_pool_size

'show variables

like

'innodb_log_buffer_size

'show variables

like

'innodb_additional_mem_pool_size

'

b+樹高度一般2~3層,查詢某一鍵值的行記錄,通過b+樹一般2~3次io

行鎖:共享鎖s - 允許乙個事物區讀一行,阻止其他事物獲得相同的資料集的排他鎖 lock in share mode/排他鎖x - 允許獲得排他鎖的事物更新資料,但是阻止其他事物獲得相同資料集的共享鎖和排他鎖 for update

當我們用範圍條件而不是相等條件鍵鎖資料,並要求共享或排他鎖時,innodb會給符合條件的已有資料的索引項枷鎖,對於鍵值在條件範圍內單不存在記錄,叫做間隙,innodb會對這個間隙枷鎖,這種鎖機制不是所謂的間隙鎖

一共101條資料,select * from emp where id > 100 for update,系統會為id為101的記錄加鎖,也會為id大於101的間隙加鎖,可以防止幻讀以滿足隔離級別的要求,防止其他事物插入了大於100的任何記錄,那麼本事物如果再次執行上述語句,就會發生幻讀

在使用範圍條件鍵鎖並鎖定記錄時,innodb這種加鎖機制會組賽符合條件範圍內值的併發插入

表鎖:意向共享鎖is - 表示事物準備給資料行加入共享鎖,也就是說乙個資料行加共享鎖前必須先獲得is鎖/意向排他鎖ix - 表示事物準備給資料行加入排他鎖,說明事物在乙個資料行加排他鎖前必須先取的該錶的ix鎖

意向鎖是innodb自動加的,不需要使用者干預。對於insert/update/delete, innodb會自動給涉及的資料加排他鎖;對於一般的select語句不會加任何鎖

set autocommit=0;

locak tables t1 write, t2

read

, ...;

[do something with tables t1 and here];

commit

;unlock tables;

myisam表鎖是不會死鎖的,因為他是一次性獲取所需的全部鎖,但innodb鎖是逐步獲取的,所以他可能發生死鎖

innodb死鎖後,會自動檢測,並使乙個事物是放鎖並退回,另乙個事物獲得鎖。同時可設定超時來防止死鎖。

如何防止死鎖:

1. 應用程式中,盡量約定以相同的順序訪問表。

2. 批處理資料時,盡量對資料排序,保證每個執行緒按照固定的順序來處理記錄

3. 在事物中,如果要更新記錄,直接申請足夠級別的鎖-排他鎖

MySql學習總結

mysql 5.1參考手冊 使用筆記 除標準sql語言外 1 啟動指令碼位置 選項檔案位置 如果使用rpm包安裝指令碼位置在 etc init.d mysqld 選項位置 etc my.cnf 2 啟動服務方法 啟動服務 service mysqld start 開機自動啟動 chkconfig m...

mysql學習總結

mysql常用命令 建立表a,複製表b的資料結構,不複製資料 create table a like b 複製表b的資料內容到表a中 前提是表a與表b資料結構一致 insert into a select from b 檢視表a的建立語句 show create table a 檢視表a的資料結構 ...

mySql 學習總結

今天基本完成了專案的模組的基本功能,剩下的就是對專案的吃透,對各種工具類的掌握,其中sql語句的書寫就顯得很重要了,特別是新的任務就是 寫乙個統計板塊,sql語句基本從網上各大扒,基本已經成型,上沒有完成的是對sql語句執行完之後得到的資料的封裝並且 給前端 現總結今天的sql函式 select s...