溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mysql中的innodb是什么

發(fā)布時(shí)間:2020-06-28 19:09:36 來(lái)源:億速云 閱讀:512 作者:元一 欄目:MySQL數(shù)據(jù)庫(kù)

mysql中的innodb是什么?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

innodb簡(jiǎn)介

InnoDB,是MySQL的數(shù)據(jù)庫(kù)引擎之一,現(xiàn)為MySQL的默認(rèn)存儲(chǔ)引擎,為MySQL AB發(fā)布binary的標(biāo)準(zhǔn)之一。InnoDB由Innobase Oy公司所開(kāi)發(fā),2006年五月時(shí)由甲骨文公司并購(gòu)。與傳統(tǒng)的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(wù)(Transaction)功能,類(lèi)似于PostgreSQL。

詳細(xì)介紹

事務(wù)型數(shù)據(jù)庫(kù)的首選引擎,支持ACID事務(wù),支持行級(jí)鎖定。InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)。InnoDB存儲(chǔ)引擎完全與MySQL服務(wù)器整合,InnoDB存儲(chǔ)引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。InnoDB存儲(chǔ)它的表&索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件(或原始磁盤(pán)分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個(gè)表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。InnoDB默認(rèn)地被包含在MySQL二進(jìn)制分發(fā)中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認(rèn)表。

InnoDB存儲(chǔ)它的表&索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件(或原始磁盤(pán)分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個(gè)表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。

性能技巧

1.如果 Unixtop或 Windows任務(wù)管理器(Task Manager)顯示服務(wù)的 CPU 占用率小于 70%,(shows that the CPU usage percentage with your workload is less than 70 %,)你的系統(tǒng)瓶頸可能在磁盤(pán)讀寫(xiě)上?;蛟S你提交了大量的事務(wù),或者是緩沖池(buffer pool)太小了。將緩沖池設(shè)大點(diǎn)會(huì)有所幫助,但一定要注意不能大于物理內(nèi)存的 80%。

2.在一個(gè)事務(wù)中包含幾個(gè)修改。如果事務(wù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,那么在這個(gè)事務(wù)提交時(shí) InnoDB 必須刷新日志到磁盤(pán)上。因?yàn)橛脖P(pán)的旋轉(zhuǎn)速度通常至多為 167 轉(zhuǎn)/秒,那么只要磁盤(pán)不欺騙操作系統(tǒng),提交的事務(wù)數(shù)目限止也同樣為 167 次/秒·用戶(hù)。

3.如果掉失最近的幾個(gè)事務(wù)無(wú)所謂的話,可以在my.cnf文件中將參數(shù)innodb_flush_log_at_trx_commit設(shè)置為 0。InnoDB 無(wú)論如何總是嘗試一秒刷新(flush)一次日志,盡管刷新并不能得到保證。

4.將日志文件(log files)設(shè)大一點(diǎn),使日志文件的總和正好與緩沖池(buffer pool)一樣大。當(dāng) InnoDB 用光日志文件的空間時(shí),它不得不在一個(gè)時(shí)間點(diǎn)上將緩沖池內(nèi)修改過(guò)的內(nèi)容寫(xiě)到磁盤(pán)上。 小的日志文件可能引起不必要的磁盤(pán)寫(xiě)操作。但是大的日志文件的缺點(diǎn)就是在數(shù)據(jù)恢復(fù)時(shí)將占用較長(zhǎng)的時(shí)間。

5.同樣 log buffer 盡量設(shè)大點(diǎn),比如說(shuō) 8 MB。

6.如果要存儲(chǔ)變長(zhǎng)的字符串或字段可能會(huì)包含大量的 NULLs,請(qǐng)使用CHAR型字段代替VARCHAR。一個(gè)CHAR(n)字段總是使用 n bytes 來(lái)存儲(chǔ)數(shù)據(jù),即使這個(gè)字符串很短或是一個(gè) NULL 值。較小的表更加適合緩沖池同時(shí)能夠減少磁盤(pán) I/O 。

7.(適合從 3.23.41 以上版本) 在某些版本的 Linux 和 Unixes 中,使用 Unixfsync或其它類(lèi)似的方法將文件刷新到磁盤(pán)是異常地慢的。InnoDB 默認(rèn)的方法就是fsync。如果你對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的磁盤(pán)寫(xiě)性能不能感到滿(mǎn)意,你可以嘗試在my.cnf中將innodb_flush_method設(shè)置為O_DSYNC,盡管O_DSYNC選項(xiàng)在多數(shù)的系統(tǒng)上看起來(lái)比較慢。

8.在向 InnoDB 導(dǎo)入數(shù)據(jù)時(shí),請(qǐng)確認(rèn) MySQL 沒(méi)有打開(kāi)autocommit=1。否則每個(gè)插入語(yǔ)句都要將 log 刷新到磁盤(pán)。在你的 SQL 導(dǎo)入文件的第一行加入

set autocommit=0;并在最后一行加入commit;

如果使用mysqldump選項(xiàng)--opt,你將會(huì)得到一個(gè)快速導(dǎo)入 InnoDB 表的轉(zhuǎn)儲(chǔ)(dump)文件,甚至可以不再使用上面所提的set autocommit=0; ... commit;。

9.小心 insert 集全的大回滾(roolback):在插入時(shí) InnoDB 使用插入緩沖來(lái)減少磁盤(pán) I/O,但在相應(yīng)的回滾中卻沒(méi)有使用這樣的機(jī)制。一個(gè) disk-bound rollback 可能會(huì)花費(fèi)相應(yīng)插入時(shí)間的 30 倍。如果發(fā)生一個(gè)失控的回滾,你可以查看第 6.1 章節(jié)的技巧來(lái)停止它。

10.同樣也要小心一個(gè)大的 disk-bound 的操作。使用DROP TABLE或TRUNCATE(從 MySQL-4.0 以上) 來(lái)清空一個(gè)表,而不要使用DELETE FROM yourtable。

關(guān)于mysql中的innodb是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI