Mysql优化-存储引擎
摘抄并用于自查笔记
一、存储引擎概述
1. 为什么要选择合理的数据库存储引擎
Mysql中的数据用各种不同的技术存储在文件(或内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能获得额外的速度或者功能,从而改善你的应用的整体功能。
2. 定义
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
3. 存储引擎作用
1)设计并创建数据库以保存系统所需的关系或XML文档。
2)实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。
3)为单位或客户部署实现的系统。
4)提供日常管理支持和优化数据库的性能。
4. 如何修改数据库引擎
1)修改配置文件my.ini
将mysql.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的殷勤修改为InnoDB。
2)在建表的时候指定
create table mytbl(
)type=MyISAM;
3)建表后更改
alter table mytbl type=InnoDB;
5. 查看数据库引擎
show table status from db_name;
二、Mysql各大存储引擎
先看本地mysql支持哪些数据库引擎
show engines;
存储引擎主要有:MyIsam、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archive、Federated、Mrg_Myisam。但现在主要分析MyIsam和InnoDB。
1)InnoDB
InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。
InnoDB引擎提供了对数据库ACID事务的支持,并且实现了sql标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于mysql后台的完整数据库系统,mysql运行时InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当select count(*) from table 时需要扫描全表。当需要使用数据库事务时,该引擎是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用InnoDB引擎会提升效率,但是使用行级锁也不是绝对的,如果在执行一个sql语句时,mysql不能确定要扫描范围,InnoDB表同样会锁全表。
// 下面这个语句锁全表
select * from products where name='xxx' for update;
适用场景:
1)经常更新的表,适合处理多重并发的更新请求(支持行锁)
2)支持事务
3)可以从灾难中恢复(通过bin-log日志等)
4)外键约束。只有他支持外键约束。
5)支持自动增加列属性auto_increment。
注:ACID,A事务的原子性(Atomicity),指一个事务要么全部执行,要么不执行;C事务的一致性(Consistency),指事务的运行并不改变数据库中数据的一致性,例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变;I事务的独立性(Isolation),事务的独立性也有时称作隔离性,指两个以上 的事务不会出现交错执行的状态,因为这样可能会导致数据不一致;D持久性(Durability)事务的持久性指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库中,不会无故回滚。
2)MyIsam
MyIsam没有提供对数据库事务的支持,也不支持行级锁和外键,因此,当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率会低一些。
引擎在创建表的时候,会创建三个文件,一个是 .frm 文件用于存储表的定义,一个是 .MYD 文件用于存储表的数据,另个是 .MYI 文件,存储的是索引。操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么 .MYD 这个文件单独来存放数据自然可以优化数据库的查询等操作。有索引管理和字段管理。MyIsam还使用一种表格锁定机制,来优化多个并发的读写操作,其代价是你需要经常运行 OPTIMIZE TABLE 命令,来恢复被更新机制所浪费的空间。
适用场景:
1)不支持事务的设计,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己业务需求进行相应的控制。
2)不支持外键的表设计。
3)查询速度很快,但是如果数据库insert和update操作比较多的话,比较适用?
4)update全表加锁
5)MyIsam极度强调快速读取操作。
6)MyIsam中存储了表的行数,于是 select count(*) from table 时只需要直接读取已经保存好的值,而不需要全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIsam也是很好的选择。
缺点:
不能在表损坏后恢复数据
MyIsam索引方法-索引顺序存取方法:
是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新次数。
特性:MyIsam执行读取操作的速度很快,而且不占用大量的内存和存储资源。
在设计之初就预想数据组织成有固定长度的记录,按顺序存储的。——MyIsam是一种静态索引结构。
缺点:
不支持事务,且不能容错,如果你的硬盘崩溃了,那么数据库文件就无法恢复 ,如果你正在把Isam用在关键任务的应用程序里,那就必须经常备份所有的实时数据,通过其复制特性,Mysql能支持这样的备份应用程序。