数据引擎
数据库引擎是数据库用于存储、处理和保护数据的核心服务,不同的数据库引擎有其各自的特点,如存储机制、索引技巧、主键的处理、锁的粒度等特点便随着引擎的不同而变化。因此,针对自己项目特点选择合适的数据库引擎可以改善服务器端存储性能。engine=innodb MyISAM
create table t_users(…) engine=innodb default charset utf8;
SHOW ENGINES命令来查看MySQL使用的引擎
在MySQL中不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
support列的值表示某种引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎。
一个命令的基本执行过程:
1、服务端开启,客户端连接服务端的接口,进入连接池(包括权限、线程、连接限制)。
2、客户端发送指令给mysql的服务端。
3、服务端接收到这个指令,解析成对应的底层操作,然后解析器解析接受到的指令,进行操作,然后优化(包括查询速度加快等)。
4、解析完后,要去磁盘中拿数据,在这个过程中要经过存储引擎。
5、找自己指定的存储引擎,然后进入磁盘文件系统,在发送给客户端。
1、InnoDB存储引擎
InnoDB是一个事务型存储引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种隔离级别,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于高并发情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键)
支持事务:支持4个事务隔离界别,支持多版本读
行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
支持外键约束,不支持全文索引(5.5之前),以后的都支持。
InnoDB缺点
(1)该引擎不支持FULLTEXT类型的索引
(2)没有保存表的行数,在执行select count(*) from 表名时,需要遍历扫描全表
InnoDB适合
可靠性要求比较高或者要求事务,适合处理多重并发的更新请求。
支持事务和外键约束。
表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建。
可以从灾难中恢复(通过bin-log日志等)
支持自动增加列属性auto_increment
2、MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
MyIsam引擎是MySQL主流引擎之一,但它相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些,在高并发时可能会遇到瓶颈,但MyIsam引擎独立于操作系统,可以在windows及linux上使用。
MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
MyISAM缺点
不能在表损坏后恢复数据
MyISAM适合
极度强调快速读取
表中自动存储了表的行数,需要时直接获取即可,即支持快速count(*)操作
插入不频繁,查询非常频繁
没有事务、外键功能及需要对整个表加锁的情形
一般选择
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择。
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。