InnoDB:
InnoDB 引擎是MySQL數據庫的另一個重要的存儲引擎、被包含在所有的二進制安裝包里面、和其它的存儲引擎相比、InnoDB引擎的優點是支持兼容ACID的事物、以及參數完整性(有外鍵)等。MySQL5.5.5以后默認的存儲引擎都是InnoDB引擎;
特性:
1:支持事務(要么全成功、要么全失敗);
2:行級鎖定(更新數據時一般指鎖定當前行):通過索引實現、全表掃描忍讓時表鎖、注意間隙所的影響;
3:讀寫阻塞與事務的隔離級別相關;
4:具有非常高的緩存特性(既能緩存索引、也能緩存數據);
5:這個表和主鍵以組(Cluster)的方式存儲、組成一顆平衡樹;
6:所有的輔助索引(secondary indexes)都會保存主鍵信息;
7:支持分區、表空間類似與oracle 數據庫;
8:支持外鍵約束、不支持全文檢索(5.5.5之前的MyISAM支持全文檢索、5.5.5之后就不在支持);
9:相對MyISAM而言、對硬件的要求比較高
應用場景:
1:需要支持事務的業務;
2:行級鎖定對於高並發有很好的適應能力、但是需要保證查詢是通過索引完成的;
3:數據讀寫都很頻繁的環境(如:BBS、微博等);
4:對數據一致性要求比較高的業務(如充值、銀行轉轉);
5:硬件設備內存較大、可以很好的利用InnoDB較好的緩存能里來提高內存利用率、減少IO的開銷;
調優精要:
1:主鍵盡可能的小、避免給輔助索引(secondary indexes)帶來過大的空間負擔;
2:避免全表掃描(會使用表鎖);
3:盡可能的緩存所有的索引和數據、提高響應速度、減少磁盤IO消耗;
4:在大批量小插入的時候、盡量自己控制事務、而不使用autocommit自動提交;
5:合理設置Innodb_flush_log_ad_trx_commit 參數值、不要過度追求安全性;
如果值為0、log buffer每秒就會被刷寫日志文件進入磁盤、提交事務的時候不做任何操作;
6:避免主鍵更新(主鍵更新會帶來大量的數據移動);
存儲:
InnoDB表由共享表空間文件(ibdata1)、獨占表空間文件(ibd)、表結構文件(.frm)、以及日志文件(redo)組成;
獨占表空間文件:
若將innodb_file_per_table 設置為 on、則系統將為每一個表單獨生成一個 table_name.ibd 的文件、在此文件中、存儲與該表相關的數據、索引、表的內容、數據字典等信息;
共享表空間文件:
在InnoDB存儲引擎中、默認表空間文件是 ibdata1 (主要存儲的是共享表空間數據),初始化為10M,可以擴展;共享表空間的大小
可以修改、使用 nnodb_data_file_path=ibdata1:370M;ibdata2:50M:autoextend 修改;使用共享表空間存儲方式時,Innodb的所有數據保存在一個單獨的表空間里面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。而在使用單獨表空間存儲方式時,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。
以下即為不同平台下,單獨表空間文件最大限度。
Operating System --- File-size Limit
Win 32 w/FAF/FAT32 --- 2GB/4GB
Win 32 w/NTFS --- 2TB(possibly larger)
Linux 2.4+ (using ext3 file system) --- 4TB
Solaris 9/10 --- 16TB
MacOS X w/ HFS+ --- 2TB
NetWare w/NSS file system --- 8TB