3. 存储引擎经历千辛万苦,mysql终于算出了最终的执行计划,然后就可以直接执行了吗?
好吧。。。依然还不可以。
我们知道,表是由一行一行的记录组成的,但这只是逻辑上的概念,或者说只是看上去是这样而已。
3.1 什么是存储引擎到底该把数据存储在什么位置,是内存还是磁盘?怎么从表里读取数据,以及怎么把数据写入具体的表中,这都是存储引擎 负责的事情。
好吧,看到这里或许你还不知道存储引擎到底是什么。毕竟存储引擎这个名字听起来太玄乎了,它的前身叫做表处理器,是不是就接地气了许多呢?
3.2 为什么需要存储引擎因为存储的需求不同。
试想一下:
如果一张表,需要很高的访问速度,而不需要考虑持久化的问题,是不是最好把数据放在内存呢?如果一张表,是用来做历史数据存档的,不需要修改,也不需要索引,那是不是要支持数据的压缩?如果一张表用在读写并发很多的业务中,是不是要支持读写互不干扰,而且要保证比较高的数据一致性呢?大家应该明白了,为什么要支持这么多的存储引擎,因为一种存储引擎不能提供所有的特性。
存储引擎是计算机抽象的典型代表,它的功能就是接受上层指令,然后对表中数据进行读取和写入,而这些操作对上层完全是屏蔽的。你甚至可以查阅mysql文档定义自己的存储引擎,只要对外实现同样的接口就可以了。
存储引擎就是mysql对数据进行读写的插件而已,可以根据不同目的随意更换(插拔)
3.3 存储引擎怎么用3.3.1 创建表的时候指定存储引擎在创建表的时候可以指定当前表的存储引擎,如果没有指定,默认的存储引擎为innodb,如果想显式指定存储引擎,可以这样
create table `t_user_innodb` ( `id` int(11) not null auto_increment, primary key (`id`)) engine=innodb default charset=utf8mb4;3.3.2 修改表的存储引擎alter table 表名 engine = 存储引擎名称;3.4 存储引擎底层区别下面我们分别创建3张设置了不同存储引擎的表, t_user_innodb 、 t_user_myisam 、t_user_memory我们看一下不同存储引擎在底层存储方面的差异,首先找到mysql的数据存储目录
mysql> show variables like 'datadir';+---------------+-----------------+| variable_name | value |+---------------+-----------------+| datadir | /var/lib/mysql/ |+---------------+-----------------+进入到目标目录之后,找到当前数据库对应的目录(mysql会为一个数据库创建一个同名的目录),数据库中表的存储结构如下不同的存储引擎存放数据的方式不一样,产生的文件数量和格式也不一样,innodb文件包含2个,memory文件包含1个,myisam文件包含3个。
3.5 常见存储引擎比较首先我们查看一下当前mysql服务器支持的存储引擎都有哪一些。
mysql> show engines;+--------------------+---------+--------------+------+------------+| engine | support | transactions | xa | savepoints |+--------------------+---------+--------------+------+------------+| innodb | default | yes | yes | yes || mrg_myisam | yes | no | no | no || memory | yes | no | no | no || blackhole | yes | no | no | no || myisam | yes | no | no | no || csv | yes | no | no | no || archive | yes | no | no | no || performance_schema | yes | no | no | no || federated | no | null | null | null |+--------------------+---------+--------------+------+------------+其中,
support表示该存储引擎是否可用;default表示当前mysql服务器默认的存储引擎;transactions表示该存储引擎是否支持事务;xa表示该存储引擎是否支持分布式事务;savepoints表示该存储引擎是否支持事务的部分回滚。3.5.1 mylsam应用范围比较小,表级锁定限制了读/写的性能,因此在web和数据仓库配置中,通常用于只读或以读为主的工作。
特点:
支持表级别的锁(插入和更新会锁表),不支持事务;拥有较高的插入(insert)和查询(select)速度;存储了表的行数(count速度更快)。怎么快速向数据库插入100万条数据?
可以先用mylsam插入数据,然后修改存储引擎为innodb。
3.5.2 innodbmysql 5.7及更新版中的默认存储引擎。innodb是一个事务安全(与acid兼容)的mysql 存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。innodb行级锁(不升级为更粗粒度的锁)和oracle风格的一致非锁读提高了多用户并发性。innodb将用户数据存储在聚集索引中,以减少基于主键的常见查询的i/o。为了保持数据完整性,innodb还支持外键引用完整性约束。
特点:
支持事务,支持外键,因此数据的完整性、一致性更高;支持行级别的锁和表级别的锁;支持读写并发,写不阻塞读(mvcc);特殊的索引存放方式,可以减少io,提升査询效率。番外:innodb本来是innobaseoy公司开发的,它和mysql ab公司合作开源了innodb的代码。但是没想到mysql的竞争对手oracle把innobaseoy收购了。后来08年sun公司(开发java语言的sun)收购了mysql ab,09年sun公司又被oracle收购了,所以mysql和 innodb又是一家了。有人觉得mysql越来越像oracle,其实也是这个原因。
3.5.3 memory将所有数据存储在ram中,以便快速访问。这个引擎以前被称为堆引擎。
特点:
把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失;只适合做临时表。3.5.4 csv它的表实际上是带有逗号分隔值的文本文件。csv表允许以csv格式导入或转储数据, 以便与读写相同格式的脚本和应用程序交换数据。因为csv表没有索引,所以通常在正常操作期间将数据保存在innodb表中,只在导入或导出阶段使用csv表。
特点:
不允许空行,不支持索引;格式通用,可以直接编辑,适合在不同数据库之间导入导出。3.5.5 archive专用与存档,空间经过压缩,用于存储和检索大量很少引用的信息。
特点:
不支持索引;不支持update、delete。3.6 如何选择存储引擎如果对数据一致性要求比较高,需要事务支持,可以选择innodb。如果数据查询多更新少,对查询性能要求比较高,可以选择myisam。如果需要一个用于查询的临时表,可以选择memory。如果所有的存储引擎都不能满足你的需求,并且技术能力足够,可以根据官网内部手册用c语言开发一个存储引擎:https://dev.mvsql.com/doc/internals/en/custom-engine.html
中控智慧科技指纹识别考勤机U160介绍
从嫦娥一号到嫦娥四号的光辉历程
GitHub无故封禁开源项目引网友不满 都是开源代码受管制惹的祸?
了解不锈钢螺旋板换热器常见故障和处理方法
LED数码管滚动显示
一条SQL查询语句是怎么去执行的?(下)
Imagination帮助设计师开发差异化的物联网产品
ADI LT8653S具有低EMI、高效率的双通道2 A稳压器
三款正反转点动控制电路图解析
微处理器TMS570在汽车制动系统中的应用研究
太阳能电池与我们的生活/习惯
魅蓝Note6和小米5X对比评测:配置、外观、价格、拍照功能一览,谁更具性价比?
配网故障定位系统:实现实时监测、精准控制
溢丰华创专利获评“中国科技创新优秀发明成果”
嵌入式设备是怎样发展的
买电动车要留心电瓶易被“掉包”
Expand 命令示例
射极跟随电路设计
魅蓝5s又迈了一大步,千元机普及快充第一机
锂电池的充电电路与保护电路设计