什麼是MySql數據庫mysql
一般意義上,數據庫也就是數據的集合,具體到計算機上數據庫能夠是存儲器上一些文件的集合或者一些內存數據的集合。
咱們一般說的MySql數據庫,sql server數據庫等等實際上是數據庫管理系統,它們能夠存儲數據,並提供查詢和更新數據庫中的數據的功能等等。根據數據庫如何存儲數據和如何操做數據的實現機制不一樣,這些數據庫之間即有區別又有共同點。
MySql數據庫是開放源代碼的關係型數據庫。目前,它能夠提供的功能有:支持sql語言、子查詢、存儲過程、觸發器、視圖、索引、事務、鎖、外鍵約束和影像複製等。在後期,咱們會詳細講解這些功能。
同Oracle 和SQL Server等大型數據庫系統同樣,MySql也是客戶/服務器系統而且是單進程多線程架構的數據庫。
MySql區別於其它數據庫系統的一個重要特色是支持插入式存儲引擎。sql
那麼什麼是存儲引擎呢?數據庫
存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)。
在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)是否須要外鍵支持;而後按照標準,選擇對應的存儲引擎便可。