鄭州哪里做網(wǎng)站最好線上廣告接單平臺
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或者內(nèi)存)中。這些技術(shù)中的每一種都?使用不同的存儲機(jī)制、索引技巧、鎖定水平并且最終提供廣泛的、不同的功能和能力。通過?選擇不同的技術(shù),能夠獲得額外的速度或者功能,從而改善應(yīng)用的整體性能。
這些不同的技術(shù)以及配套的相關(guān)功能在?MySQL中被稱作存儲引擎(也稱作表類型)。MySQL默認(rèn)配置了許多不同的存儲引擎,可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用。選擇適用于服務(wù)器、數(shù)據(jù)庫和表格的存儲引擎,可以在存儲信息、檢索數(shù)據(jù)時(shí),提供最大的靈活性。
對于MySQL來說,它提供了很多種類型的存儲引擎(或者說不同的表類型),根據(jù)對?數(shù)據(jù)處理的需求,可以選擇不同的存儲引擎,從而最大限度的利用MySQL強(qiáng)大的功能。
在MySQL客戶端中,使用以下命令可以查看?MySQL支持的引擎。
mysql>show engines;
MyISAM存儲引擎
MyISAM存儲引擎不支持事務(wù),也不支持外鍵,特點(diǎn)是訪問速度快,對事務(wù)完整性沒有要求,以SELECT、INSERT為主的應(yīng)用基本都可以使用這個(gè)引擎來創(chuàng)建表。
每個(gè)MyISAM表在磁盤上存儲成3 個(gè)文件,其中文件名和表名都相同,但是擴(kuò)展名分別為:
frm(存儲表定義)
MYD(MYData,存儲數(shù)據(jù))?
MYI(MYIndex,?存儲索引)
數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分配IO, ?獲取更快的速度。要指定數(shù)據(jù)文件和索引文件的路徑,需要在創(chuàng)建表的時(shí)候通過DATA?DIRECTORY和INDEX DIRECTORY語句指定,文件路徑需要使用絕對路徑。
每個(gè)MyISAM表都有一個(gè)標(biāo)志,服務(wù)器或myisamchk程序在檢查MyISAM數(shù)據(jù)表時(shí)會對這個(gè)標(biāo)志進(jìn)行設(shè)置。MyISAM?表還有一個(gè)標(biāo)志用來表明該數(shù)據(jù)表在上次使用后是不是被正常的關(guān)閉了。如果服務(wù)器意外宕機(jī)或崩潰,這個(gè)標(biāo)志可以用來判斷數(shù)據(jù)表是否需要檢查和修復(fù)。如果想讓這種檢查自動進(jìn)行,可以在啟動服務(wù)器時(shí)使用-myisam-recover實(shí)現(xiàn)。這會讓服務(wù)器在每次打開一個(gè)MyISAM數(shù)據(jù)表時(shí)自動檢查數(shù)據(jù)表的標(biāo)志并進(jìn)行必要的修復(fù)處理。MyISAM類型的表可能會損壞,可以使用CHECK TABLE?語句來檢查MyISAM表的健康,并用REPAIR TABLE語句修復(fù)一個(gè)損壞的MyIS?AM表。MyISAM表還支持3種不同的存儲格式:
靜態(tài)(固定長度)表
動態(tài)表
壓縮表
其中靜態(tài)表是默認(rèn)的存儲格式。靜態(tài)表中的字段都是非可變字段,這樣每個(gè)記錄都是固定長度的,這種存儲方式的優(yōu)點(diǎn)是存儲非常迅速,容易緩存,出現(xiàn)故障容易恢復(fù);缺點(diǎn)是占?用的空間通常比動態(tài)表多。靜態(tài)表在數(shù)據(jù)存儲時(shí)會根據(jù)列定義的寬度定義補(bǔ)足空格,但是在訪問的時(shí)候并不會得到這些空格,這些空格在返回給應(yīng)用之前已經(jīng)去掉。同時(shí)需要注意:在某些情況下可能需要返回字段后的空格,而使用這種格式時(shí)后面的空格會被自動處理掉。
動態(tài)表包含可變字段,記錄不是固定長度的,這樣存儲的優(yōu)點(diǎn)是占用空間較少,但是頻繁的更新、刪除記錄會產(chǎn)生碎片,需要定期執(zhí)行OPTIMIZE TABLE語句或myisamchk -r?命令來改善性能,并且出現(xiàn)故障的時(shí)候恢復(fù)相對比較困難。
壓縮表由myisamchk工具創(chuàng)建,占據(jù)非常小的空間,因?yàn)槊織l記錄都是被單獨(dú)壓縮的,所以只有非常小的訪問開支。
InnoDB???存儲引擎
InnoDB是一個(gè)健壯的事務(wù)型存儲引擎,這種存儲引擎已經(jīng)被很多互聯(lián)網(wǎng)公司使用,為用戶操作非常大的數(shù)據(jù)存儲提供了一個(gè)強(qiáng)大的解決方案。MySQL 從5.5.5?版本開始,默認(rèn)的存儲引擎為InnoDB?。InnoDB存儲引擎還引入了行級鎖定和外鍵約束,在以下場景中使用InnoDB存儲引擎是最理想的選擇:
>更新密集的表:InnoDB存儲引擎特別適合處理多重并發(fā)的更新請求。?
>事務(wù):InnoDB存儲引擎是支持事務(wù)的標(biāo)準(zhǔn)MySQL存儲引擎。
>自動災(zāi)難恢復(fù):與其它存儲引擎不同,InnoDB表能夠自動從災(zāi)難中恢復(fù)。
>外鍵約束:MySQL支持外鍵的存儲引擎只有InnoDB。?
>支持自動增加列AUTO_INCREMENT屬性。
一般來說,如果需要事務(wù)支持,并且有較高的并發(fā)讀取頻率,InnoDB是不錯(cuò)的選擇。而MyISAM和InnoDB兩種存儲引擎的區(qū)別主要表現(xiàn)在以下幾個(gè)方面。
InnoDB | MyISAM | |
事務(wù) | 支持事務(wù),支持四個(gè)事務(wù)隔離級別 | 不支持事務(wù),需要事務(wù)支持的系統(tǒng)不能使用 MyISAM 作為存儲引擎 |
鎖定 | 行級鎖定,但是全表掃描仍然會是表級鎖定 | 表級鎖定形式,數(shù)據(jù)在更新時(shí)鎖定整個(gè)表 |
讀寫阻塞 | 讀寫阻塞與事務(wù)隔離級別相關(guān) | 數(shù)據(jù)庫在讀寫過程中相互阻塞 在數(shù)據(jù)寫入的過程中阻塞用戶對數(shù)據(jù)的讀取 在數(shù)據(jù)讀取的過程中阻塞用戶寫入數(shù)據(jù) |
緩存 | 具有非常高效的緩存特性,能緩存索引,也能緩存數(shù)據(jù) | 可以通過 key_buffer_size 來設(shè)置緩存索引,提高訪問的性能,減少磁盤 IO 的壓力 |
寫入和讀取 | 寫入和讀取的速度較慢 | 采用 MyISAM 存儲引擎進(jìn)行數(shù)據(jù)單獨(dú)寫入或讀取,速度較快且占用資源相對要少 |
外鍵 | 支持外鍵約束 | MyISAM 存儲引擎不支持外鍵約束,只支持全文索引 |
修改默認(rèn)的存儲引擎
修改默認(rèn)的存儲引擎有四種方法,分別如下。
(1)通過 alter?table?修改。
MySQL>alter table user_info engine=MyISAM;
(2)通過修改my.cnf,?指定默認(rèn)存儲引擎并重啟服務(wù)。
[root@Mysql ]#vim my.cnf
default-storage-engine=InnoDB
(?3?)?通?過create??table?創(chuàng)建表時(shí)指定存儲引擎。
MySQL>create table engineTest(id int)engine=MyISAM;
(4)?通 過Mysql_convert_table_format ???轉(zhuǎn)化存儲引擎。
[root@Mysql /#yum -y install perl-DBI perl-DBD-MySQL
[root@Mysql]#/usr/local/mysql/bin/mysql_convert_table_format --user=root -password='123456'--sock=/tmp/mysql.sock auth