读一读

  1. 吞吐量,单位时间内的事务处理数。TPS每秒事务数,TPM每分钟事务数

  2. 响应时间或者延迟,根据不同的时间单位可以计算出平均响应时间,最小响应时间,最大响应时间和所占百分比。通常使用百分比响应时间来替代最大响应时间。

  3. 并发性,指的是任意时间有多少同时发生的并发请求。

  4. 可扩展性,给系统增加一倍的资源,就可以获得两倍的吞吐量。但是,线性扩展,一般是不可能的。


  1. 集成式:测试整个应用系统。

  2. 单组件式:测试mysql,比较索引不同的效果,比较查询性能等。



基准测试是针对系统设计的一种压力测试。通常的目标是为了掌握系统的行为,也可以是重现某个系统状态或者是做新硬件的可靠性测试。基准测试的一个主要问题在于其不是真实压力的测试。基准测试施加给系统的压力对于真实压力来说,通常比较简单。真实压力受多方面因素,情况复杂。所以使用基准测试出来的结果,不能完全的相信这就是应该的结果(只是参考)。


  1. 最简单的方法:ALTER TABLE table_name ENGINE = InnoDB;,Mysql会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁,所以可能要执行很长时间。

  2. 导出导入方法,将表导出,修改创建时的默认引擎和表名,再导入。

  3. 创建和查询(CREATE和SELECT)

CREATE TABLE innodb_table LIKE myisam_table;
ALTER TABLE innodb_table ENGINE=InnoDB;
INSERT INTO innodb_table SELECT * FROM myisam_table;

如果数据量大的话可以讲第三行改为分批插入。


在大部分情况下,InnoDB都是正确的选择,怎么说呢,就是选InnoDB吧。


SELECT:

  1. InnoDB只查找版本早于当前事务版本的数据行,这样可以确保事务读取的行,要么是事务开始前已经存在,要么是事务自身插入或者修改过的。

  2. 行的删除版本要么未定义,要么大于当前的事务版本号。确保事务读取到的行,在事务开始之前没有被删除。

INSERT:InnoDB为新插入的每一行保存当前系统版本号作为行版本号。

DELETE:InnoDB为删除的每一行保存当前系统版本号作为行删除标识。

UPDATE:InnoDB为插入一行新纪录,保存当前系统版本号为行版本号,同时保存当前系统版本号到原来的行作为行删除标志。

保存这两个额外系统版本号,使大多数读操作都可以不用加锁。不足的就是每行记录都需要额外的存储空间和更多的检查维护工作。


MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。一般都实现了多版本并发控制。

MVCC认为是行级锁的一个变种,但是在很多情况下避免了加锁操作。

MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

只针对可重复读和不可重复读这两种隔离级别。


MySQL默认采用自动提交模式。也就是说,如果不是显式地开始一个事务,则每个查询都被当作一个事务执行提交操作。

查看自动提交开关:

show variables like 'autocommit';

如果自动提交被禁用,所有的查询都是在一个事务中,直到显式地执行COMMIT或ROLLBACK,该事务结束,同时又开始另一个新事务。


是指两个或多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。