本文地址:https://www.askmac.cn/archives/mysql-storage-engines-choice.html
8.4 选择合适的存储引擎
当建立一张表,你需要首先问一下自己这张表被用于何种类型的查询。然后选择一种存储引擎来适合查询所涉及到的锁级别。MyISAM表级锁对于在进行繁重的查询数据抽取而极少有更新的情况下运行效果好。而如果运行中有大量更新操作的话,InnoDB是更好的选择。InnoDB使用行级锁和多版本控制对于大量数据读取和更新提供了并行性。一个查询可以对某些行进行更新,而同时其它查询则可以对同表中的其它行进行读取和更新。
如果你使用MyISAM表,那么使用何种列结构来对处理速度或磁盘使用效率的考量就会变得重要。不同的MyISAM存储格式具有不同的性能特定。其影响你最终是否选择定长或变长列进行字符串数据存储:
- 为了最佳的速度而使用定长列(CHAR, BINARY)。使用固定长度的列使得MySQL得以以固定长度的行建立表。定长行的优势在于,所有行都按位置存储在表中,而这些行的寻找非常迅速。不利在于定长值总是占据了相同长度空间,即便在值并没有用足此列的真个长度下,因此定长列的存储需要花更多空间。
- 考虑最佳空间使用而使用变长列(VARCHAR, VARBINARY, TEXT, BLOB)。例如,在VARCHAR列中的值仅会占用必要的存储空间,而平均计算的话,比CHAR列储存空间占用小。不利在于变长列会导致变长行。这些值的存储将不会在表的固定位置上,因此它们不能如定长行一般获取如此迅速。此外变长行的内容甚至可能并不是存放在一个位置上,这也导致了一些处理开销。
使用MyISAM表的另一种方式是用来作为压缩的只读表。
对于InnoDB表,使用CHAR列平均上来看会比表VARCHAR使用更多空间。但是InnoDB中两者不会如在MyISAM中具有查询速度差异。这是由于InnoDB引擎在实现上对CHAR和VARCHAR使用了相似方式。事实上,CHAR值的获取可能还慢一些,因为平均上来说,它们需要从磁盘上读取更多信息。
使用MEMORY存储引擎存储的数据,那么你既不需要其保持持久性,或者你允许之后从基表中来重新生成表数据。
8.5 使用多种存储引擎对性能的影响
存储引擎可以在同一个服务端,甚至在一个查询下被混合使用。常量数据可以被存储在MyISAM中,动态的业务关键数据则使用InnoDB和(对于临时表)MEMORY进行存放。引擎的转换很简单:
alter table <table> engine=<engine>;
而在背后,混合的数据库引擎配置则显得更复杂些,其包括了备份技术,维护,调优等等。且使用多种引擎也会发生一些潜在的bug。优化器则对此将处于一个特别艰难的时刻。此外,所有存储引擎都有其自有的内存缓冲。因此使用多种存储引擎会导致每个引擎分配更少的缓冲空间。
使用多种存储引擎所带来的性能问题:
混合存储引擎的使用可以提供整体性能,如,对于需要进行大量更改或缓存的小表使用MEMORY引擎,对于大量读数据或需要FULLTEXT索引时使用MyISAM引擎。对于涉及需要大量UPDATE,DELETE,日志归档等操作时使用InnoDB引擎。
存储引擎混合使用的不利面,则在于它们都有自用的缓冲,因此增加了对所有MySQL使用的存储引擎进行有效内存共享的设置难度。还有一大不利点在于,将事务表和非事务表混合在同一个事务中进行处理,需要注意的是,非事务表不能被回滚,因此应尽量避免这种操作。
mysqldump备份工具可以对所有事务型存储引擎进行在线的非块级备份(除了NDB,其具有特定的备份程序)。非事务存储引擎也在可以在线进行备份。注意,备份时,DML语句活动会被挂起直到备份完成。
Comment