標籤:
什麼是MySql資料庫
通常意義上,資料庫也就是資料的集合,具體到電腦上資料庫可以是儲存空間上一些檔案的集合或者一些記憶體資料的集合。
我們通常說的MySql資料庫,sql server資料庫等等其實是資料庫管理系統,它們可以儲存資料,並提供查詢和更新資料庫中的資料的功能等等。根據資料庫如何儲存資料和如何操作資料的實現機制不同,這些資料庫之間即有區別又有共同點。
MySql資料庫是開放原始碼的關係型資料庫。目前,它可以提供的功能有:支援sql語言、子查詢、預存程序、觸發器、視圖、索引、事務、鎖、外鍵約束和影像複製等。在後期,我們會詳細講解這些功能。
同Oracle 和SQL Server等大型資料庫系統一樣,MySql也是客戶/伺服器系統並且是單進程多線程架構的資料庫。
MySql區別於其它資料庫系統的一個重要特點是支援插入式儲存引擎。
那麼什麼是儲存引擎呢?
儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。因為在關聯式資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表類型(即儲存和操作此表的類型)。
在Oracle 和SQL Server等資料庫中只有一種儲存引擎,所有資料存放區管理機制都是一樣的。而MySql資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。
MySql中有哪些儲存引擎?
1 MyISAM:這種引擎是mysql最早提供的。這種引擎又可以分為靜態MyISAM、動態MyISAM 和壓縮MyISAM三種:
靜態MyISAM:如果資料表中的各資料列的長度都是預先固定好的,伺服器將自動選擇這種表類型。因為資料表中每一條記錄所佔用的空間都是一樣的,所以這種表存取和更新的效率非常高。當資料受損時,恢複工作也比較容易做。
動態MyISAM:如 果資料表中出現varchar、xxxtext或xxxBLOB欄位時,伺服器將自動選擇這種表類型。相對於靜態MyISAM,這種表格儲存體空間比較小,但 由於每條記錄的長度不一,所以多次修改資料後,資料表中的資料就可能離散的儲存在記憶體中,進而導致執行效率下降。同時,記憶體中也可能會出現很多片段。因 此,這種類型的表要經常用optimize table 命令或最佳化工具來進行磁碟重組。
壓縮MyISAM:以上說到的兩種類型的表都可以用myisamchk工具壓縮。這種類型的表進一步減小了佔用的儲存,但是這種表壓縮之後不能再被修改。另外,因為是壓縮資料,所以這種表在讀取的時候要先時行解壓縮。
但是,不管是何種MyISAM表,目前它都不支援事務,行級鎖和外鍵約束的功能。
2 MyISAM Merge引擎:這種類型是MyISAM類型的一種變種。合并表是將幾個相同的MyISAM表合并為一個虛表。常應用於日誌和資料倉儲。
3 InnoDB:InnoDB表類型可以看作是對MyISAM的進一步更新產品,它提供了事務、行級鎖機制和外鍵約束的功能。
4 memory(heap):這種類型的資料表只存在於記憶體中。它使用散列索引,所以資料的存取速度非常快。因為是存在於記憶體中,所以這種類型常應用於暫存資料表中。
5 archive:這種類型只支援select 和 insert語句,而且不支援索引。常應用於日誌記錄和彙總分析方面。
當然MySql支援的表類型不止上面幾種。
下面我們介紹一下如何查看和設定資料表類型。
show ENGINES --查看儲存引擎
desc tablename --查看錶結構
show CREATE table tablesname --顯示表的建立語句
show table status like ‘tablename‘ --顯示表的目前狀態值
修改儲存引擎,可以用命令Alter table tableName engine =engineName
MyISAM表是獨立於作業系統的,這說明可以輕鬆地將其從Windows伺服器移植到Linux伺服器;每當我們建立一個MyISAM引擎的表時,就會 在本地磁碟上建立三個檔案,檔案名稱就是表明。例如,我建立了一個MyISAM引擎的tb_Demo表,那麼就會產生以下三個檔案:
1.tb_demo.frm,儲存表定義;
2.tb_demo.MYD,儲存資料;
3.tb_demo.MYI,儲存索引。
MyISAM表無法處理事務,這就意味著有交易處理需求的表,不能使用MyISAM儲存引擎。MyISAM儲存引擎特別適合在以下幾種情況下使用:
1.選擇密集型的表。MyISAM儲存引擎在篩選大量資料時非常迅速,這是它最突出的優點。
2.插入密集型的表。MyISAM的並發插入特性允許同時選擇和插入資料。例如:MyISAM儲存引擎很適合管理郵件或Web伺服器日誌資料。
InnoDB
InnoDB是一個健壯的事務型儲存引擎,這種儲存引擎已經被很多互連網公司使用,為使用者操作非常大的資料存放區提供了一個強大的解決方案。我的電腦 上安裝的MySQL 5.6.13版,InnoDB就是作為預設的儲存引擎。InnoDB還引入了行級鎖定和外鍵約束,在以下場合下,使用InnoDB是最理想的選擇:
1.更新密集的表。InnoDB儲存引擎特別適合處理多重並發的更新要求。
2.事務。InnoDB儲存引擎是支援事務的標準MySQL儲存引擎。
3.自動災難恢複。與其它儲存引擎不同,InnoDB表能夠自動從災難中恢複。
4.外鍵約束。MySQL支援外鍵的儲存引擎只有InnoDB。
5.支援自動增加列AUTO_INCREMENT屬性。
一般來說,如果需要事務支援,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。
MEMORY
使用MySQL Memory儲存引擎的出發點是速度。為得到最快的回應時間,採用的邏輯儲存介質是系統記憶體。雖然在記憶體中儲存表資料確實會提供很高的效能,但當 mysqld守護進程崩潰時,所有的Memory資料都會丟失。獲得速度的同時也帶來了一些缺陷。它要求儲存在Memory資料表裡的資料使用的是長度不 變的格式,這意味著不能使用BLOB和TEXT這樣的長度可變的資料類型,VARCHAR是一種長度可變的類型,但因為它在MySQL內部當做長度固定不 變的CHAR類型,所以可以使用。
一般在以下幾種情況下使用Memory儲存引擎:
1.目標資料較小,而且被非常頻繁地訪問。在記憶體中存放資料,所以會造成記憶體的使用,可以通過參數max_heap_table_size控制Memory表的大小,設定此參數,就可以限制Memory表的最大大小。
2.如果資料是臨時的,而且要求必須立即可用,那麼就可以存放在記憶體表中。
3.儲存在Memory表中的資料如果突然丟失,不會對應用服務產生實質的負面影響。
Memory同時支援散列索引和B樹索引。B樹索引的優於散列索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等 操作符方便資料採礦。散列索引進行“相等比較”非常快,但是對“範圍比較”的速度就慢多了,因此散列索引值適合使用在=和<>的操作符中,不 適合在<或>操作符中,也同樣不適合用在order by子句中。
MERGE
MERGE儲存引擎是一組MyISAM表的組合,這些MyISAM表結構必須完全相同,儘管其使用不如其它引擎突出,但是在某些情況下非常有用。說 白了,Merge表就是幾個相同MyISAM表的彙總器;Merge表中並沒有資料,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上 是對內部的MyISAM表進行操作。Merge儲存引擎的使用情境。
對於伺服器日誌這種資訊,一般常用的儲存策略是將資料分成很多表,每個名稱與特定的時間端相關。例如:可以用12個相同的表來儲存伺服器日誌資料, 每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的資料來產生報表,這意味著需要編寫並更新多表查詢,以反映這些表中的資訊。與其編寫這 些可能出現錯誤的查詢,不如將這些表合并起來使用一條查詢,之後再刪除Merge表,而不影響原來的資料,刪除Merge表只是刪除Merge表的定義, 對內部的表沒有任何影響。
ARCHIVE
Archive是歸檔的意思,在歸檔之後很多的進階功能就不再支援了,僅僅支援最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支援索引,但是在MySQL 5.5以後的版本中就開始支援索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會即時壓縮,所以它經常被用來當做倉庫使 用。
儲存引擎的一些問題
1.如何查看伺服器有哪些儲存引擎可以使用?
為確定你的MySQL伺服器可以用哪些儲存引擎,執行如下命令:
複製代碼 代碼如下:
show engines;
這個命令就能搞定了。
2.如何選擇合適的儲存引擎?
(1)選擇標準可以分為:
(2)是否需要支援事務;
(3)是否需要使用熱備;
(4)崩潰恢複:能否接受崩潰;
(5)是否需要外鍵支援;
然後按照標準,選擇對應的儲存引擎即可。
MySql儲存引擎