INNODB與MyISAM兩種表存儲引擎區別

mysql數據庫分類爲INNODB爲MyISAM兩種表存儲引擎了,兩種各有優化在不一樣類型網站可能選擇不一樣,下面小編爲各位介紹mysql更改表引擎INNODB爲MyISAM技巧。
常見的mysql表引擎有INNODB和MyISAM,主要的區別是INNODB適合頻繁寫 數據庫 操做,MyISAM適合讀取數據庫的狀況多一點,如何把表引擎INNODB更改成MyISAM呢?

使用如下mysql sql語句,能夠給表設定數據庫引擎:php

ALTER TABLE `wp_posts` ENGINE = MyISAM;html

在須要使用mysql的全文索引(FULLTEXT index)的時候,這張表的數據庫引擎必須是MyISAM類型。關於INNODB爲MyISAM數據庫引擎有什麼具體區別mysql

例子sql

修改表的存儲引擎myisam<=>innodb
 
查看錶的存儲引擎
mysql> show create table tt7;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| tt7   | CREATE TABLE `tt7` (
  `id` int(10) default NULL,
  `name` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
查看錶的數據量
mysql> select count(1) from tt7;
+----------+
| count(1) |
+----------+
| 16777216 | 
+----------+
1 row in set (0.00 sec)
 
方法一:數據庫

直接更改存儲引擎
mysql> alter table tt7 engine=innodb;
Query OK, 16777216 rows affected (2 min 39.80 sec)
Records: 16777216  Duplicates: 0  Warnings: 0緩存

方法二:
 
把方法一中的存儲引擎改回myisam
mysql> alter table tt7 engine=myisam;
Query OK, 16777216 rows affected (27.09 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
從這裏也能夠看出myisam表要比innodb錶快不少
 
建立個和tt7一樣表結構的表
mysql> create table tt7_tmp like tt7;
Query OK, 0 rows affected (0.02 sec)
 
tt7_tmp做爲中間結果集
mysql> insert into tt7_tmp select * from tt7;
Query OK, 16777216 rows affected (27.20 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
 
刪除原表的數據
mysql> truncate table tt7;
Query OK, 16777725 rows affected (0.18 sec)
 
這回更改原表的存儲引擎
mysql> alter table tt7 engine=innodb;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
速度很快就完成了
 
再把中間結果集的數據導回原表中
mysql> insert into tt7 select * from tt7_tmp;
Query OK, 16777216 rows affected (2 min 0.95 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
 
刪除中間表
mysql> drop table tt7_tmp;安全

測試結果:服務器

方法二比較快一點,可是數據量要是比較大的話,方法二就要採用化整爲零的分批操做的方式,不然insert操做將會具耗時,併產生大量的undo日誌。
若是是小表的話(500M之內,根據本身系統的硬件環境),採用方法一就能夠
若是是大表的話,那就採用方法二+批量的方式併發

若是是批量更改表的存儲引擎工具

用於生成變動的SQL語句:

SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema='db_name' AND ENGINE='myisam';

用於生成檢查表的SQL語句:

SELECT CONCAT('CHECK TABLE ',table_name) FROM information_schema.tables WHERE table_schema='db_name';

根據本身系統配置修改以下參數,以加快變動速度(記得之前的值,一會還得改回來)

SET GLOBAL sort_buffer_size=64*1024*1024;
SET GLOBAL tmp_table_size=64*1024*1024;
SET GLOBAL read_buffer_size=32*1024*1024;
SET GLOBAL read_rnd_buffer_size=32*1024*1024;

MYSQL中myisam和innodb引擎的區別

MyISAM 是MySQL中默認的存儲引擎,通常來講不是有太多人關心這個東西。決定使用什麼樣的存儲引擎是一個很tricky的事情,可是仍是值咱們去研究一下,這裏的文章只考慮 MyISAM 和InnoDB這兩個,由於這兩個是最多見的。

講講你對mysql myisam和innodb的認識。而後你認爲他們的區別在那裏?爲何?

答:這兩個是MySQL主要存儲引擎。

簡要介紹來自官網。

簡要介紹:myIsam

myIdam是默認存儲引擎。它基於更老的ISAM代碼,但有不少有用的擴展。(注意MySQL5.1不支持ISAM)。

每一個myisam在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD(MYData)。索引文件的擴展名是.MYI(MYIndex)。

簡要介紹:InnoDB

InnoDB給MySQL提供了具備提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級而且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特點增長了多用戶部署和性能。沒有在InnoDB中擴大鎖定的須要,由於在InnoDB中行級鎖定適合很是小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你能夠自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也能夠混合。

InnoDB是爲處理巨大數據量時的最大性能設計。它的CPU效率多是任何其它基於磁盤的關係數據庫引擎所不能匹敵的。

InnoDB存儲引擎被徹底與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池。InnoDB存儲它的表&索引在一個表空間中,表空間能夠包含數個文件(或原始磁盤分區)。這與MyISAM表不一樣,好比在myisam表中每一個表被存在分離的文件中。InnoDB表能夠是任何尺寸,即便在文件尺寸被限制爲2GB的操做系統上。

InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成爲Windows上MySQL的默認表。

InnoDB被用來在衆多須要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。Mytrix Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的負荷。

簡單歸納幾點以下:

1.  經過以上不難看出,myIsam InnoDB的用途,myisam主要適用於中小型數據量。InnoDB引擎適用於大數據量。上面已經講得很清楚拉。著名的開源電子商務系統[magento]就是採用InnoDB建立。

2.  myIsam寫入速度比InnoDB快。

3.  在使用InnoDB時候須要對my.cnf進行配置以保證MySQL達到最大效率。詳細能夠查看官網[inndo性能調節]:
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。

其中有不少人在網上發表了關於mysql myIdam和InnoDB在存貯和讀取方面的差別。暫時尚未作過分研究。

基本測試都是基於使用[事務]和不使用[事務],進行對比。MySQL對於[非事務表]速度會比較塊。

下面先讓咱們回答一些問題:
◆你的數據庫有外鍵嗎?
◆你須要事務支持嗎?
◆你須要全文索引嗎?
◆你常用什麼樣的查詢模式?
◆你的數據有多大?

myisam只有索引緩存

innodb不分索引文件數據文件 innodb buffer

myisam只能管理索引,在索引數據大於分配的資源時,會由操做系統來cache;數據文件依賴於操做系統的cache。innodb無論是索引仍是數據,都是本身來管理

思考上面這些問題可讓你找到合適的方向,但那並非絕對的。若是你須要事務處理或是外鍵,那麼InnoDB 多是比較好的方式。若是你須要全文索引,那麼一般來講 MyISAM是好的選擇,由於這是系統內建的,然而,咱們其實並不會常常地去測試兩百萬行記錄。因此,就算是慢一點,咱們能夠經過使用Sphinx從InnoDB中得到全文索引。

數據的大小,是一個影響你選擇什麼樣存儲引擎的重要因素,大尺寸的數據集趨向於選擇InnoDB方式,由於其支持事務處理和故障恢復。數據庫的在小決定了故障恢復的時間長短,InnoDB能夠利用事務日誌進行數據恢復,這會比較快。而MyISAM可能會須要幾個小時甚至幾天來幹這些事,InnoDB只須要幾分鐘。

您操做數據庫表的習慣可能也會是一個對性能影響很大的因素。好比: COUNT() 在 MyISAM 表中會很是快,而在InnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會至關至關的快,但須要當心的是若是咱們的主鍵太長了也會致使性能問題。大批的inserts 語句在 MyISAM下會快一些,可是updates 在InnoDB 下會更快一些——尤爲在併發量大的時候。

因此,到底你檢使用哪個呢?根據經驗來看,若是是一些小型的應用或項目,那麼MyISAM 也許會更適合。固然,在大型的環境下使用 MyISAM 也會有很大成功的時候,但卻不老是這樣的。若是你正在計劃使用一個超大數據量的項目,並且須要事務處理或外鍵支持,那麼你真的應該直接使用 InnoDB方式。但須要記住InnoDB 的表須要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有很是壞的體驗。

===========================================================

MyISAM:這個是默認類型,它是基於傳統的ISAM類型,ISAM是 Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法.與其餘存儲引擎比較,MyISAM具備檢查和修復表格的大多數工具. MyISAM表格能夠被壓縮,並且它們支持全文搜索.它們不是事務安全的,並且也不支持外鍵。若是事物回滾將形成不徹底回滾,不具備原子性。若是執行大量的SELECT,MyISAM是更好的選擇。

InnoDB:這種類型是事務安全的.它與BDB類型具備相同的特性,它們還支持外鍵.InnoDB表格速度很快.具備比BDB還豐富的特性,所以若是須要一個事務安全的存儲引擎,建議使用它.若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表,

對於支持事物的InnoDB類型的標,影響速度的主要緣由是AUTOCOMMIT默認設置是打開的,並且程序沒有顯式調用BEGIN 開始事務,致使每插入一條都自動Commit,嚴重影響了速度。能夠在執行sql前調用begin,多條sql造成一個事物(即便autocommit打開也能夠),將大大提升性能。

===============================================================

InnoDB和MyISAM是在使用MySQL最經常使用的兩個表類型,各有優缺點,視具體應用而定。下面是已知的二者之間的差異,僅供參考。

innodb
InnoDB 給 MySQL 提供了具備事務(commit)、回滾(rollback)和崩潰修復能力 (crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。 InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non- locking read in SELECTs)。這些特性均提升了多用戶併發操做的性能表現。在InnoDB表中不須要擴大鎖定 (lock escalation),由於 InnoDB 的列鎖定(row level locks)適宜很是小的空間。 InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。

InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基於磁盤的關係數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。 InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不同,舉例來講,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操做系統的文件大小,通常爲 2 GB。
InnoDB全部的表都保存在同一個數據文件 ibdata1 中(也多是多個文件,或者是獨立的表空間文件),相對來講比較很差備份,免費的方案能夠是拷貝數據文件、備份 binlog,或者用mysqldump

MyISAM
MyISAM 是MySQL缺省存貯引擎 .

每張MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。 索引文件是 MYI (MYIndex) 引申。

由於MyISAM相對簡單因此在效率上要優於InnoDB..小型應用使用MyISAM是不錯的選擇.

MyISAM表是保存成文件的形式,在跨平臺的數據轉移中使用MyISAM存儲會省去很多的麻煩

如下是一些細節和具體實現的差異:

1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。

另外,InnoDB表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如 update table set num=1 where name like 「%aaa%」

任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優點。

===============================================================

如下是InnoDB和MyISAM的一些聯繫和區別!

1. 4.0以上mysqld都支持事務,包括非max版本。3.23的須要max版本mysqld才能支持事務。

2. 建立表時若是不指定type則默認爲myisam,不支持事務。
能夠用 show create table tablename 命令看錶的類型。

2.1 對不支持事務的表作start/commit操做沒有任何效果,在執行commit前已經提交,測試:
執行一個msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;

begin;
insert into tn values(‘a’);
insert into ty values(‘a’);
select * from tn;
select * from ty;
都能看到一條記錄

執行另外一個mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一條記錄
而後在另外一邊
commit;
才都能看到記錄。

3. 能夠執行如下命令來切換非事務表到事務(數據不會丟失),innodb表比myisam表更安全:
alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name
但能夠用check table,以及mysqlcheck [OPTIONS] database [tables]

==============================================================

mysql中使用select for update的必須針對InnoDb,而且是在一個事務中,才能起做用。

select的條件不同,採用的是行級鎖仍是表級鎖也不同。
轉 的說明

因爲InnoDB 預設是Row-Level Lock,因此只有「明確」的指定主鍵,MySQL 纔會執行Row lock (只鎖住被選取的資料例) ,不然MySQL 將會執行Table Lock (將整個資料表單給鎖住)。

舉個例子:

假設有個表單products ,裏面有id 跟name 二個欄位,id 是主鍵。

例1: (明確指定主鍵,而且有此筆資料,row lock)

SELECT * FROM products WHERE id=’3′ FOR UPDATE;

例2: (明確指定主鍵,若查無此筆資料,無lock)

SELECT * FROM products WHERE id=’-1′ FOR UPDATE;

例2: (無主鍵,table lock)

SELECT * FROM products WHERE name=’Mouse’ FOR UPDATE;

例3: (主鍵不明確,table lock)

SELECT * FROM products WHERE id<>’3′ FOR UPDATE;

例4: (主鍵不明確,table lock)

SELECT * FROM products WHERE id LIKE ’3′ FOR UPDATE;

注1:
FOR UPDATE 僅適用於InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。


 

相關文章
相關標籤/搜索