1. 程式人生 > >MySQL存儲引擎MyISAM與InnoDB

MySQL存儲引擎MyISAM與InnoDB

var 應用 usr 指定 ket type inf 數據讀取 code

存儲引擎的實質就是如何實現存儲數據,為存儲數據建立索引以及查詢、更改、刪除數據等技術實現的方法。

  • MySQL支持插件式的表存儲引擎,這種獨有的插件式體系架構,讓存儲引擎有了依賴應用的多樣性。其中較為知名的存儲引擎為MyISAM與InnoDB.
  • MySQL系統中,存儲引擎處於文件系統之上,在數據保存到數據文件之前會先傳輸到存儲引擎,然後按照各個存儲引擎的存儲格式進行數據存儲。使用這種存儲引擎的主要優點在於,僅僅需要提供特殊應用的特性即可;數據庫中的系統開銷較小,更具有有效和高效的數據庫性能。

MyISAM存儲引擎特點

  • 1、不支持事務處理,需要事務支持的系統不能使用MyISAM作為存儲引擎
  • 2、表級鎖定形式,數據在更新時會鎖定整個表。
  • 3、數據庫在讀寫的過程中相互阻塞:

    在數據寫入的過程中阻塞用戶對數據的讀取;
    在數據讀取的過程中阻塞用戶寫入數據;

  • 4、可以通過key_buffer_size來設置緩存索引,提高訪問的性能,減少磁盤IO的壓力。
  • 5、采用MyISAM存儲引擎不支持外鍵約束,只支持全文索引。
  • 6、采用MyISAM存儲引擎進行數據單獨寫入或者讀取,速度較快且占用資源相對要少。
  • 7、MyISAM存儲的文件類型:

    .frm 文件存儲表定義;
    數據文件擴展名為.MYD(MYDATA);
    索引文件擴展名為.MYI(MYIndex);

InnoDB存儲引擎特點

  • 1、支持事務處理,支持四個事務隔離級別。
  • 2、行級鎖定,但是全表掃描時會鎖定整個表。
  • 3、讀寫阻塞與事務隔離級別相關。
  • 4、具有非常高效的緩存特性,能緩存索引,也能緩存數據。
  • 5、表與主鍵以簇的方式存儲。
  • 6、支持分區、表空間,類似oracle數據庫。
  • 7、支持外鍵約束,MySQL5.5以前不支持全文索引,後面的版本支持。
  • 8、適合對硬件資源要求較高的場合。

存儲引擎的更改與選擇方式

  • 查看數據庫使用的存儲引擎方法:

show table status from school where name=‘info‘;

或者:

show create table info;

配置存儲引擎的幾種方式:

  • 1、使用alter table命令修改:
    (修改現有表的存儲引擎)

alter table info engine=MyISAM/InnoDB; //進入數據庫操作

  • 2、修改默認存儲引擎:
    (針對後面新創建的表格起作用)

#vim /etc/my.cnf

default-storage-engine=MyISAM/InnoDB      //在[mysql]服務欄下設置默認存儲引擎
  • 3、在創建表時指定使用的存儲引擎種類: //在mysql模式下

create table test(name varchar(10)) engine=InnoDB;
show create table test;

  • 4、mysql_convert_table_format命令可以批量轉換存儲引擎
    註:此種工具使用只能存在於MySQL5.5版本以前。

yum install perl-DBI perl-DBD-MySQL -y //安裝操作運行庫

默認情況下只能將已存在的InnoDB的存儲引擎更改為MyISAM形式,若需要反過來更改需要更改命令執行腳本:

vim /usr/local/mysql/bin/mysql_convert_table_format

(第四種同時更改多表的存儲引擎為在MySQL5.5版本為例)

$opt_help=$opt_version=$opt_verbose=$opt_force=0;
$opt_user=$opt_database=$opt_password=undef;
$opt_host="localhost";
$opt_socket="";
$opt_engine="MYISAM";
$opt_port=0;
$exit_status=0;

GetOptions(
  "e|engine|type=s"       => \$opt_type,        //32行,type更改為engine即可
  "f|force"               => \$opt_force,
  "help|?"               => \$opt_help,
  "h|host=s"              => \$opt_host,
  "p|password=s"          => \$opt_password,
  "u|user=s"              => \$opt_user,
  "v|verbose"             => \$opt_verbose,
  "V|version"             => \$opt_version,
  "S|socket=s"            => \$opt_socket,
  "P|port=i"              => \$opt_port

然後用:(Linux模式下利用該命令)

mysql_convert_table_format --host=localhost --user=root --password=abc123 --socket=/tmp/mysql.socket --engine=InnoDB school test01 test02

--host=localhost    //表示本地數據庫
--user=root           //表示登錄用戶
--password=abc123  //表示登錄密碼
--socket=/tmp/mysql.socket  //指定socket目錄
--engine-InnoDB       //需要更改後的存儲引擎
school      //指定需要更改的庫
test01 test02    //需要同時更改的表

可以同時更改test01 test02多個表的存儲引擎。

MySQL存儲引擎MyISAM與InnoDB