mysql--存储引擎(四)

1.存储引擎:常用的有MyISAM 和InnoDB。mysql的每种存储引擎在mysql里是通过插件的方式使用的。支持多种存储引擎。

2.事务回顾

mysql支持事务的引擎:innodb/ndb。

事务四大特性,ACID 原子性,一致性,隔离性,持久性。

set autocommit=OFF 禁止自动提交 ON 开启自动提交

rollback 回滚事务

commit 提交事务

3.MyISAM介绍

MySQL5.1 默认的存储引擎是MyISAM,每一个MyISAM表都对应硬盘上的三个文件,同样的文件名,不同的扩展名指示其类型用途.。

.frm文件保存表定义,这个文件不是MyISAM引擎的一部分,而是服务器的一部分。.MYD保存表的数据,.MYI是表的索引文件。而这两个是MyISAM的

关键。比如在/data/3306/data下去查看mysql库中的数据文件,

mysql--存储引擎(四)_第1张图片

3.1 MyISAM引擎特点

不支持事务;

表级锁定,更新时锁整个表。虽然让锁定的实现成本很小,但是降低了并发性能。

读写时互相阻塞,但读本身并不会阻塞另外的读。

只缓存索引。通过key_buffer_size缓存索引,提高访问性能减少磁盘io,但是这个缓存区只缓存索引,不缓存数据。

grep key_buffer my.cnf

key_buffer_size = 16M

读取速度快,占用资源相对少。

不支持外键约束,但支持全文索引。

3.2MyISAM引擎适合的生产业务场景

不需要事务支持的业务

数据修改相对较少(阻塞问题)

适合读多的应用,比如www,blog,用户数据库,商品库,图片信息库

对数据一致性要求不是很高的业务

硬件资源比较差的机器

小结:单一对数据库操作,尽量纯读,或者纯写。

3.3 调优精要

设置合适的索引(缓存)

调整读写优先级,根据实际需要确保重要操作先执行

启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)

尽量顺序操作让insert数据都写入到尾部,减少阻塞。

分解大的时间长的操作,降低单个操作的阻塞时间

降低并发数(减少对mysql访问),某些高并发场景通过应用进行排队队列机制实现。

对于相对静态的数据库数据,充分利用Query Cache或者memcached缓存服务可以极大的提高访问效率。

[root@hdp4 3306]# grep query my.cnf

query_cache_size = 2M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

COUNT只有在全表扫描时才高效,其他带有条件的count都需要进行实际的数据访问。

可以把主从同步的主库用innodb,从库用myisam.

4.innodb引擎

4.1 特点

支持事务。

行级锁定,更新时锁定当前行,通过索引时间,全表扫描仍然是表锁。

读写阻塞与事务隔离级别相关

整个表和主键以Cluster方式存储,组成一棵平衡树。

所有Sencondary Index都会保存主键信息。

支持分区,表空间。

支持外键,对硬件资源要求比较高

4.2 适合的生产业务场景

需要事务支持的业务

行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成 的。

数据读写及更新都较为频繁,比如bbs,微博

数据一致性要求高的业务,比如银行卡转账

硬件设备内存较大,可以利用innodb 的缓存能力来提高内存利用率,尽可能减少磁盘io。

mysql--存储引擎(四)_第2张图片

mysql--存储引擎(四)_第3张图片

共享表空间对应物理数据文件:/data/3306/data/ibdata1

独立表空间对应物理数据文件:

innodb_file_per_table

innodb_data_home_dir=/data/xxx

4.3 调优精要

主键尽可能小,避免给Secondary index带来过大的空间负担。

避免全表扫描,因为会使用表锁。

尽可能缓存所有的索引和数据,提高响应速度,减少磁盘io消耗。

在大批量小插入的时候,尽量自己控制事务而不适用autocommit自动提交,

合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性,如果这个值设置为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。一般设置为2.

避免主键更新,会带来大量数据移动。

5.修改引擎

5.1 alter table stu ENGINE=INNODB或者是MyISAM

5.2 使用sed对备份内容进行殷勤转换

5.3 mysql_convert_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyISAM 库名 表名

 

 

 

你可能感兴趣的:(数据库)