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库中的数据文件,
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。
共享表空间对应物理数据文件:/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 库名 表名