MySQL學習筆記1 0

2021-10-03 03:08:01 字數 2772 閱讀 9585

1.這兩種日誌有以下三點不同。redo log 是 innodb 引擎特有的;binlog 是 mysql 的 server 層實現的,所有引擎都可以使用。

2.redo log 是物理日誌,記錄的是「在某個資料頁上做了什麼修改」;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯。

3.redo log 是迴圈寫的,空間固定會用完;binlog 是可以追加寫入的。「追加寫」是指 binlog 檔案寫到一定大小後會切換到下乙個,並不會覆蓋以前的日誌。

為了保證資料庫的一致性,必須要保證2份日誌一致,因此使用的兩階段式提交。

sql 標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable )。

在 innodb 中,表都是根據主鍵順序以索引的形式存放的,這種儲存方式的表稱為索引組織表。又因為前面我們提到的,innodb 使用了 b+ 樹索引模型,所以資料都是儲存在 b+ 樹中的。

根據葉子節點的內容,索引型別分為主鍵索引和非主鍵索引。主鍵索引的葉子節點存的是整行資料。在 innodb 裡,主鍵索引也被稱為聚簇索引(clustered index)。非主鍵索引的葉子節點內容是主鍵的值。在 innodb 裡,非主鍵索引也被稱為二級索引(secondary index)。

覆蓋索引、最左字首原則、索引下推

mysql 裡面表級別的鎖有兩種:一種是表鎖,一種是元資料鎖(meta data lock,mdl)。

mdl 不需要顯式使用,在訪問乙個表的時候會被自動加上。mdl 的作用是,保證讀寫的正確性在 mysql 5.5 版本中引入了 mdl,當對乙個表做增刪改查操作的時候,加 mdl 讀鎖;當要對錶做結構變更操作的時候,加 mdl 寫鎖。

普通索引和唯一索引應該怎麼選擇?

其實,這兩類索引在查詢能力上是沒差別的,主要考慮的是對更新效能的影響。實際使用中,普通索引和 change buffer 的配合使用,對於資料量大的表的更新優化還是很明顯的。

索引選擇異常和處理:

對於由於索引統計資訊不準確導致的問題,可以用 analyze table 來解決。

而對於其他優化器誤判的情況:

1.採用 force index 強行選擇乙個索引。

2.考慮修改語句,引導 mysql 使用我們期望的索引。

3.在有些場景下,可以新建乙個更合適的索引,來提供給優化器做選擇,或刪掉誤用的索引。

1.使用字首索引,定義好長度,就可以做到既節省空間,又不用額外增加太多的查詢成本。但使用字首索引就無法使用覆蓋索引對查詢效能的優化,這也是在選擇是否使用字首索引時需要考慮的乙個因素。

2.總結:

乙個 innodb 表包含兩部分,即:表結構定義和資料。表結構定義占用的空間很小,主要考慮表資料的空間**。

表資料既可以存在共享表空間裡,也可以是單獨的檔案。這個行為是由引數 innodb_file_per_table 控制的:

這個引數設定為 off 表示的是,表的資料放在系統共享表空間,也就是跟資料字典放在一起;

這個引數設定為 on 表示的是,每個 innodb 表資料儲存在乙個以 .ibd 為字尾的檔案中。

從 mysql 5.6.6 版本開始,它的預設值就是 on 了。我建議你不論使用 mysql 的哪個版本,都將這個值設定為 on。因為,乙個表單獨儲存為乙個檔案更容易管理,而且在你不需要這個表的時候,通過 drop table 命令,系統就會直接刪除這個檔案。而如果是放在共享表空間中,即使表刪掉了,空間也是不會**的。

如果要收縮乙個表,只是 delete 掉表裡面不用的資料的話,表檔案的大小是不會變的,還要通過 alter table 命令重建表,才能達到表檔案變小的目的。

count(*)、count(主鍵 id) 和 count(1) 都表示返回滿足條件的結果集的總行數;而 count(字段),則表示返回滿足條件的資料行裡面,引數「字段」不為 null 的總個數。

如果直接使用 order by rand(),這個語句需要 using temporary 和 using filesort,查詢的執行代價往往是比較大的。所以,在設計的時候你要盡量避開這種寫法。在實際應用的過程中,比較規範的用法就是:盡量將業務邏輯寫在業務**中,讓資料庫只做「讀寫資料」的事情。

對索引欄位做函式操作,可能會破壞索引值的有序性,因此優化器就決定放棄走樹搜尋功能。同時,隱式型別轉換,隱式字元編碼轉換,也會要求在索引欄位上做函式操作而導致了全索引掃瞄。

一種是 statement,一種是 row。還有一種 mixed,其實它就是前兩種格式的混合。

當 binlog_format=statement 時,binlog 裡面記錄的就是 sql 語句的原文。

當 binlog_format 使用 row 格式的時候,binlog 裡面記錄了真實修改行的資料。

因為有些 statement 格式的 binlog 可能會導致主備不一致,所以要使用 row 格式。但 row 格式的缺點是,很佔空間。比如你用乙個 delete 語句刪掉 10 萬行資料,用 statement 的話就是乙個 sql 語句被記錄到 binlog 中,占用幾十個位元組的空間。但如果用 row 格式的 binlog,就要把這 10 萬條記錄都寫到 binlog 中。這樣做,不僅會占用更大的空間,同時寫 binlog 也要耗費 io 資源,影響執行速度。所以,mysql 就取了個折中方案,也就是有了 mixed 格式的 binlog。mixed 格式的意思是,mysql 自己會判斷這條 sql 語句是否可能引起主備不一致,如果有可能,就用 row 格式,否則就用 statement 格式。也就是說,mixed 格式可以利用 statment 格式的優點,同時又避免了資料不一致的風險。

Mysql學習筆記 10 函式

含義 一組預先編譯好的sql語句的集合,可以理解成批處理語句 作用 和儲存過程的區別 儲存過程 可以有0個返回,也可以有多個返回,適合做批量插入 批量更新 函式 有且僅有1 個返回,適合做處理資料後返回乙個結果 delimiter create function 函式名 引數列表 returns 返...

MySQL學習筆記(10)MySQL變數

變數由系統提供,不是使用者定義,屬於伺服器層面 使用語法 1 檢視所有的系統變數 show global variables 參看所有全域性變數 show session variables 檢視所有會話變數,可以不寫session2 檢視滿足條件的部分系統變數 show global variab...

Mysql學習筆記 10 聯合查詢

只有行動才能決定我在職場上的價值。若要加倍我的價值,我必須加倍努力。說明 當查詢結果來自於多張表,但多張表之間沒有關聯,這個時候往往使用聯合查詢,也稱為union查詢 語法 select 查詢列表 from 表1 where 篩選條件 union select 查詢列表 from 表2 where ...