Mysql之存储引擎
没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
MyISAM和InnoDB两者的应用场景:
1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
但是实际场景中,针对具体问题需要具体分析,一般而言可以遵循以下几个问题:
- 数据库是否有外键?
- 是否需要事务支持?
- 是否需要全文索引?
- 数据库经常使用什么样的查询模式?在写多读少的应用中还是Innodb插入性能更稳定,在并发情况下也能基本,如果是对读取速度要求比较快的应用还是选MyISAM。
- 数据库的数据有多大? 大尺寸倾向于innodb,因为事务日志,故障恢复。
Mysql存储引擎之memory
(1)memory是基于内存数据的存储引擎
(2)一张memory表,在磁盘上有一个表定义文件(.frm),在内存中保存数据。
(3)特点:基于内存,所以访问速度特别快。
(4)默认使用Hash索引,也可以指定B树索引。
(5)注意:mysql服务关闭,则表的数据就会丢失。
(6)使用memory,要注意内存是否足够。对不用的memory表,要及时删除或truncate;
(7)每个memory表的大小受系统变量max_heap_table_size的约束,初始值为16MB
(8)可以在使用--init-file选项包含一个文件,在文件中写入诸如
insert into ...select 或者 load data infile 。
效果是在mysql服务启动时,从持久稳固的数据源中装载数据。