各种搜索引擎 特性图:
简单总结就是innodb 优点:支持事务,支持行级锁,支持集群索引,支持数据缓存;支持外键
innodb缺点:空间使用高,内存使用高,批量插入速度慢;
myisam 优点:访问速度快,支持全文索引,空间使用低,内存使用低;批量插入快
缺点:不支持外键,不支持事务;
想自己测试的话可以 通过命令修改 存储引擎后 看内存使用或者 数据文件的大小即可:比如我们 验证一下这个表格的 innodb 空间占用高;myisam空间使用低 是否正确:
innodb引擎下 数据文件 大小为 10M; alter table biaoming engine = myisam ;
后,数据文件 大小为 445 KB; 空间占用小了 20倍左右,【查看文件存储位置:show global variables like
"%datadir%"
】
关于 内存,批量插入 不同引擎之间的区别的,可以自己测试一下;
需要特别注意的是 myisam 存储引擎,有 静态表,动态表,压缩表;三种类型;
静态表在存储数据时会自动补空格到固定长度;取数据时会去掉这些空格,所以 即使你专门的存储数据后带空格,在查询时也是会被丢弃的; 前面的空格会保留
innodb 自增涨列,插入0 或 空,会默认插入自增涨后的值;
alert table biaoming auto_increment = n ; 设置 自增涨列的值从N 开始;此设置在内存中,所以 重启数据库,需要重新设置;
last_insert_id() ;查看当前线程最后插入的值; 一条语句插入多条 数据情况下,查看的是 此语句的第一条数据 ;
存储引擎 memory 表的数据访问非常快,因为表数据全部在内存中;不会写到磁盘上,所以 重启会导致 memory的数据丢失;
momory 表默认大小限制为16M ;可以用 max_heap_table_size 修改;
memory 比较适合存储变化不大,或者 多张表的中间结果表;可以快速对中间表结果进行最终的统计结果;但必须要预防 重启后memory 的表数据全部会丢失;所以需要提前做好备份;
存储引擎 merge 是 将 多张myisam的表 组合成一张表;效果和查询多张表之后使用union all 类似,也类似 elasticsearch的对多个索引文件 起相同的别名 进行分组效果一样;
注意的是,merge的表 进行drop 操作,只会删除 组合表;不会删除内部的表数据;
操作尝试一下:
先创建3张test_log_2017/ test_log_2018/test_log_2019myisam的 表;并分别都插入一两条数据:
CREATE TABLE `test_log_2017` (
`log_id` int(11) DEFAULT NULL,
`CREATE_time` datetime DEFAULT NULL,
`log_nm` varchar(80) DEFAULT NULL,
KEY `idx_log_log_id` (`log_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
创建表完成后,创建merge 表:insert_method = last/ first 是因为merge是虚拟的表,并没有真实数据;这个 参数指定insert语句这张表时,真实将数据 插入到第一张还是 最后一张表中;也可以为no;表示不能插入数据;
create table test_log_all2 (
log_id int ,
CREATE_time datetime ,
log_nm VARCHAR(80),
index (log_id)
)ENGINE = merge union = (test_log_2017,test_log_2018,test_log_2019) insert_method = last;
创建完成之后 ,对表进行查询,结果就是 merge 引擎表 test_log_all2 是查询的所有的表的数据;
SELECT * from test_log_all2;
测试的merge 引擎只对 myisam 可以使用:虽然 其他引擎在创建merge表的时候,不会报错,但是在查询使用的时候回报错;如下图:创建 和 查询:
查询会报错: