提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@TOC
前言
mysql我们经常用到,我们对于mysql表的存储引擎认识又有多少呢,这篇文章会告诉你关于mysql存储引擎相关内容
一、什么是存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据; 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。
二、mysql有哪几种存储引擎
这是我在创建表的时候可选择的存储引擎,但是我们常用的数据引擎一般是innodb与myisam
- InnoDB:MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
- MyISAM:MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。
- Memory:在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失
- BLACKHOLE:黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。
- CSV:它的表真的是以逗号分隔的文本文件。CSV 表允许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。由于 CSV 表没有索引,你最好是在普通操作中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。
- NDB:(又名 NDBCLUSTER)——这种集群数据引擎尤其适合于需要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前能够支持
MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。同样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。
- Merge:允许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们作为一个对象进行引用。适用于超大规模数据场景,如数据仓库。
- Federated:提供了从多个物理机上联接不同的 MySql 服务器来创建一个逻辑数据库的能力。适用于分布式或者数据市场的场景。
- Example:这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不做的 “存根”。你可以使用这种引擎创建表,但是你无法向其保存任何数据,也无法从它们检索任何索引。
二、innodb与myisam对比
网上找了一张对比图片。很明确的写清楚了两种数据引擎的优缺点。总结一下我们什么根据什么业务情况来选择存储引擎呢?
有以下几种场景
1 如果业务上面对表不需要进行事务处理。且业务上面读多写少,尤其那种作为数据展示的业务的表。建议用myisam。
2 配置表用myisam
3 需要事务处理,用innodb 这个没得选。毕竟myisam没有事务。
实际性能对比
本地建立了一张表: 100万行数据 统计抖音视频每日播放量。现在有一个场景 就是查询所有账号近一个月每日的播放量
SELECT sum(add_play_count) add_play_count,day FROM `douyin_video_log` WHERE `video_status` = 1 AND ( `day` >= '2022-10-01' AND `day` <= '2022-10-30' ) GROUP BY `day` ORDER BY NULL
sql 为上面的
- 首先我们把存储引擎设置为innodb
三次查询记录分别耗时8.968,3.454,3.629
这里为啥第二次会比第一个耗时少很多,可以看这篇文章的解释,这里就不展开讲解了。http://t.zoukankan.com/halo623-p-13684368.html
- 这次把存储引擎设置为myisam
三次查询记录分别耗时1.687,1.687,1.687
明显比innodb耗时要短很多。
更多mysql存储引擎详解