2017年6月8日,天氣陰。心情晴。mysql
連續作夢兩個晚上了,昨晚居然夢見一個很長時間不聯繫的初中同窗了,早上上班的路上聊了聊。女孩如今出差在貴州,風景秀美的地方。我說「你如今生活很滋潤」。女孩說「那是你沒有看到我不滋潤的一面」。確實,在生活中咱們老是把本身光鮮的一面展現給別人,而把落魄的一面「假裝起來」。sql
昨天博客上有博友問我問題,居然稱呼我爲「大神」,內心慌的很,由於本身很清楚距離這個「大神」相差甚遠,因此得加倍努力,向着「大神」的目標前進。數據庫
博友問的問題是關於Mysql數據庫的,其中涉及數據引擎和修復、優化數據表語句,以前歷來沒有考慮過這些問題,更沒有用過。因此找了一些資料瞭解了一下,如今把本身找到的資料總結以下。安全
1.Mysql數據庫存儲引擎併發
概念:mvc
存儲引擎其實就是如何實現存儲數據,如何爲存儲的數據創建索引以及如何更新,查詢數據等技術實現的方法。MySQL中的數據用各類不一樣的技術存儲在文件(或內存)中,這些技術中的每一種技術都使用不一樣的存儲機制,索引技巧,鎖定水平而且最終提供普遍的不一樣功能和能力。在MySQL中將這些不一樣的技術及配套的相關功能稱爲存儲引擎。性能
(1)innoDB存儲引擎優化
①innodb存儲引擎的mysql表提供了事務,回滾以及系統崩潰修復能力和多版本併發控制的事務安全。spa
②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語句,他會整理表的碎片,恢復因爲表的更新和刪除致使的空間丟失。
若是存儲引擎不支持 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,只需在批量刪除數據行以後,按期(每週一次或每個月一次)進行一次數據表優化操做便可,只對那些特定的表運行。