MySQL存儲引擎MyISAM和InnoDB
存儲引擎
- 在MySQL中的數據擁有各種不同的技術存儲文件或內存中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不用的功能和能力。通過選擇不同的技術,能夠獲得額外的速度或者功能,從而改善應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱之爲存儲引擎。
MyISAM存儲引擎
- MyISAM存儲引擎是MySQL關係數據庫系統5.5版本之前默認的存儲引擎。
特點
1、不支持事務
2、表級鎖定形式,數據在更新時鎖定整個表
3、數據庫在讀寫過程中相互堵塞:
- 1)、在數據寫入的過程中阻塞用戶讀數據的讀取
- 2)、在數據讀取的過程中阻塞用戶寫入數據
4、可以通過key_buffer_size來設置緩存索引,提高訪問的性能,減少磁盤IO的壓力
5、採用MyISAM存儲引擎進行行數據單獨寫入或讀取,速度較塊且佔用資源相對較少
6、MyISAM存儲引擎不支持外鍵約束,只支持全文索引
7、每個MyISAM在磁盤上存儲成三個文件,每一個的名字均以表的名字開始,擴展名指出文件類型:
- 1)、.frm 文件存儲表定義。
- 2)、數據文件的擴展名爲:.MYD(MYData)。
- 3)、索引文件的擴展名爲:.MYI(MYIndex)。
InnoDB存儲引擎
特點
1、支持事物
2、行級鎖定,但是全盤掃描仍然會是表級鎖定。
3、讀寫阻塞與事務隔離級別相關
4、具有非常高效的緩存特性,能緩存索引,也能緩存數據
5、表與主鍵以簇的方式存儲
6、支持分區、表空間,類似Oracle數據庫
7、支持外鍵約束,
8、適合對硬件資源要求比較高的場合
配置合適的存儲引擎
1、查看MySQL默認使用的存儲引擎
mysql -u root -p #進入MySQL
show engines; #查看默認存儲引擎
2、查看錶存儲引擎類型
- 使用 show table status 命令查看:
mysql -u root -p
show table status from test where name='test'; #查看test數據庫中的test表的存儲引擎類型
- 使用show create 查看錶存儲引擎類型:
mysql -u root -p
use test; #使用test數據庫
show create table test; #查看test表的存儲引擎類型
3、修改存儲引擎
- 使用 alter table命令修改(只能修改已存在的表):
mysql -u root -p
use test;
alter table test engine=MyISAM; #修改test表的存儲引擎類型
show create table test;
- 修改MySQL的配置文件my.cnf,可以指定defaut-storage-engine選項設置默認的存儲引擎(只試用於新創建的表,已存在表的存儲引擎類型不變):
vim /etc/my.cnf #編輯配置文件
#省略內容
[mysqld]
default-storage-engines=MyISAM
#省略內容
systemctl restart mysqld.service #重啓MySQL服務
- 使用create table創建表時用engine指定存儲引擎(現在數據庫的默認存儲引擎爲MyISAM);
mqsql -u root -p
use test;
create table test01(id int) engine=InnoDB; #創建存儲引擎爲InnoDB的表
show create table test01;
- 使用mysql_convert_table_format命令可以批量轉換存儲引擎(只使用於MySQL5.5版本);
yum install prel-DBI -y
yum install prel-BDB-MySQL -y #安裝perl對MySQL的模塊操作
mysql_convert_table_format --user=root --password=密碼 --socket=/temp/mysql.sock --engine=MyISAM test test
但當使用此命令將存儲引擎類型更改爲InnoDB時,會出現報錯,所以需要修改其命令的腳本文件
vim /use/local/mysql/bin/mysql_convert_table_format
#省略內容
"e|engine|type=s" =>\$opt_engine, #將32行中的\$opt_type更改爲\$opt_engine
#省略內容
重新使用命令即可
mysql_convert_table_format --user=root --password=密碼 --socket=/temp/mysql.sock --engine=InnoDB test test