2023年6月8日,天氣陰。心情晴。
連續做夢兩個晚上了,昨晚竟然夢見乙個很長時間不聯絡的初中同學了,早上上班的路上聊了聊。女孩現在出差在貴州,風景秀美的地方。我說「你現在生活很滋潤」。女孩說「那是你沒有看到我不滋潤的一面」。確實,在生活中我們總是把自己光鮮的一面展示給別人,而把落魄的一面「偽裝起來」。
昨天部落格上有博友問我問題,竟然稱呼我為「大神」,心裡慌的很,因為自己很清楚距離這個「大神」相差甚遠,所以得加倍努力,向著「大神」的目標前進。
博友問的問題是關於mysql資料庫的,其中涉及資料引擎和修復、優化資料表語句,之前從來沒有考慮過這些問題,更沒有用過。所以找了一些資料了解了一下,現在把自己找到的資料總結如下。
1.mysql資料庫儲存引擎
概念:儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。mysql中的資料用各種不同的技術儲存在檔案(或記憶體)中,這些技術中的每一種技術都使用不同的儲存機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。在mysql中將這些不同的技術及配套的相關功能稱為儲存引擎。
(1)innodb儲存引擎
①innodb儲存引擎的mysql表提供了事務,回滾以及系統崩潰修復能力和多版本併發控制的事務安全。
②innodb支援自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話怎會進行自動從現有的值開始增長,如果有但是比現在的還大,則就儲存這個值。
③innodb儲存引擎支援外來鍵(foreign key),外來鍵所在的表稱為子表(或從表),而所依賴的表稱為父表(或主表)。
④innodb儲存引擎最重要的是支援事務,以及事務相關聯功能。
⑤innodb儲存引擎支援mvcc的行級鎖。
⑥innodb儲存引擎索引使用的是b+tree。
(2)myisam儲存引擎
1)myisam 這種儲存引擎不支援事務,不支援行級鎖,只支援併發插入的表鎖,主要用於高負載的select。
2)myisam 型別的表支援三種不同的儲存結構:靜態型、動態型、壓縮型。
①靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的資料型別),這樣mysql就會自動使用靜態myisam格式。
使用靜態格式的表的效能比較高,因為在維護和訪問的時候以預定格式儲存資料時需要的開銷很低。但是這高效能是由空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,佔據了整個空間。
②動態型:如果列(即使只有一列)定義為動態的(xblob, xtext, varchar等資料型別),這時myisam就自動使用動態型。
雖然動態型的表占用了比靜態型表較少的空間,但帶來了效能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致碎片的產生。隨著資料變化的怎多,碎片就會增加,資料訪問效能就會相應的降低。
對於因為碎片的原因而降低資料訪問性,有兩種解決辦法:
a、盡可能使用靜態資料型別。
b、經常使用optimize table語句,他會整理表的碎片,恢復由於表的更新和刪除導致的空間丟失。
③壓縮型:如果在這個資料庫中建立的是在整個生命週期內唯讀的表,則這種情況就是用myisam的壓縮型表來減少空間的占用。
3)myisam也是使用b+tree索引,但是和innodb的在具體實現上有些不同。
(3)memory儲存引擎
①memory儲存引擎相比前面的一些儲存引擎,有點不一樣,其使用儲存在記憶體中的資料來建立表,而且所有的資料也都儲存在記憶體中。
②每個基於memory儲存引擎的表實際對應乙個磁碟檔案,該檔案的檔名和表名是相同的,型別為.frm。該檔案只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於對資料的快速處理,提高整個表的處理能力。
③memory儲存引擎預設使用雜湊(hash)索引,其速度比使用b+tree型要快,如果讀者希望使用b樹型,則在建立的時候可以引用。
④memory儲存引擎檔案資料都儲存在記憶體中,如果mysqld程序發生異常,重啟或關閉機器這些資料都會消失。所以memory儲存引擎中的表的生命週期很短,一般只使用一次。
(4)blackhole儲存引擎(黑洞引擎)
支援事務,而且支援mvcc的行級鎖,主要用於日誌記錄或同步歸檔,這個儲存引擎除非有特別目的,否則不適合使用!
2.mysql下優化表和修復表
隨著mysql的長期使用,可以通過修復表來優化,優化時減少磁碟占用空間,方便備份。
repair table `table_name` 修復表 optimize table `table_name` 優化表
repair table ——用於修復被破壞的表。
optimize table—— 優化表,用於**閒置的資料庫空間。當表上的資料行被刪除時,所佔據的磁碟空間並沒有立即被**,使用了optimize table命令後這些空間將被**,並且對磁碟上的資料行進行重排。
注意:是磁碟上,而非資料庫。
多數時間並不需要執行optimize table,只需在批量刪除資料行之後,定期(每週一次或每月一次)進行一次資料表優化操作即可,只對那些特定的表執行。
關於Mysql資料庫的知識總結(1)
1 資料庫的發展階段 人工管理階段 檔案系統管理階段 資料庫系統階段 1 人工管理階段 容易丟失,資料重複 冗餘,查閱和使用比較困難,維護成本高 2 檔案系統管理階段 易於儲存,處理速度加快,資料形式豐富 3 資料庫系統階段 易於維護海量資料,更快的運算,保證資料的安全性,使用程式語言管理資料 2 ...
Mysql資料庫知識總結
事務4個特性 a 原子性 c 一致性 i 隔離性 d 永續性 隔離級別 讀未提交 會出現 髒讀,幻讀,不可重複讀 讀提交 幻讀 不重複讀 可重複讀 不可重複讀 序列化 序列化執行,效能較差 mysql 預設隔離級別是 可重複讀,但是網際網路專案的的資料庫隔離級別,建議設定成如提交,提高資料的效能 o...
Mysql資料庫知識 Mysql索引總結
mysql資料庫知識 mysql索引總結 索引 index 是幫助mysql高效獲取資料的資料結構。下邊是自己整理的資料與自己的學習總結,做乙個彙總。一.真的有必要使用索引嗎?不是每乙個效能問題都可以通過建立乙個索引來解決 有很多其它解決效能問題的方式 a 各個應用層的快取,b 調優資料庫引數和緩衝...