TPS: Transactions Per Second(每秒传输的事物处理个数),这是指服务器每秒处理的事务数,支持事务的存储引擎如InnoDB等特有的一个性能指标。
QPS: Queries Per Second(每秒查询处理量)同时适用于InnoDB和MyISAM引擎。
计算:
TPS = (COM_COMMIT + COM_ROLLBACK)/ UPTIME
COM_COMMIT : 表示事务提交数量
COM_ROLLBACK :表示事务回滚数量
UPTIME :引擎处理的时间
QPS = QUESTTIONS/UPTIME
QUESTTIONS:查询的处理数量
UPTIME:查询处理的时间
MySqlSlap是从MySQL的5.1.4版本开始官方提供的压力测试工具。
运行步骤:
1、创建schema、table、test、data。
2、运行负载测试,可以使用多个并发客户端连接。
3、测试环境清理(删除创建的数据、表等,断开连接。)
1000个客服端,重复10次,自动生产SQL语句,总共1000个查询。
mysqlslap -uroot-p123456 --concurrency=1000 --iterations 10 -a --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000
1,50,100,200个客服端,每一个测试3次,并打印内存,CPU信息。
mysqlslap -uroot -p123456 --concurrency=1,50,100,200 --iterations=3 --number-char-cols=5 --number-int-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --create-schema='testmysql' --debug-info
500个客户端,分别使用myisam,innodb两种存储引擎,比较效率。
mysqlslap -uroot -p123456 --concurrency=500 --iterations=3 --number-char-cols=5 --number-int-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --create-schema='testmysql' --debug-info
测试结果可以看出innodb的引擎效率比myisam的要快。
当MySQL启动(MySQL服务器就是一个进程),等待客户端连接,每一个客服端连接请求,服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独立,拥有各自的内存处理空间,但是,如果这个请求只是查询,没关系,但是若是修改数据,很显然,当两个线程修改同一块内存是会引发数据同步问题的。
连接服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客服端对某个数据库某个表的某个操作)
这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需要提供的功能(引擎对外提供接口)),例如:存储过程、触发器、视图等。
1、如果是查询语句(select语句),首先会查缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步)。
2、解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析。
3、优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。
MySQL中缓存,一个是缓存SQL语句(默认开启的),一个是查询结果缓存(虽然这个可以大大加快了查询速度,但是不建议开启,可能会把机器搞宕机了)。不过从8.0开始,查询结果缓存被弃用了。
如果是5.6可以通过下面语句查询是否开启,和设置缓存区大小。
//数据缓存是否开启
show variables like '%query_cache_type%'
//缓存的大小
show variables like '%query_cache_size%'
//设置缓冲区大小
SET GLOBAL query_cache_size = 4000;
SET GLOBAL query_cache_size = 134217728;
我们平时写的查询语句,MySQL并不一定是按照我们的写的顺序去执行的,它会解析SQL语句,然后得到一个新的查询语句进行查询。解析SQL语句顺序的逻辑。
通过explain分析查询过程,语句的类型是SIMPLE,表示product_info,总行数rows,执行条件using where。
通过explain分析查询过程,因为1=1是永TRUE,所以可以优化掉后面的部分,所以Extra是空的。
通过explain分析查询过程,因为id是主键,不能为空,所以Extra提示错误。
//查看当前MySQL已提供什么存储引擎,可以看到默认使用的引擎
show engines;
MySQL5.5之前默认的存储引擎。
MyISAM存储引擎由MYD和MYI组成。
在MySQL的data中找打这个表,发现下面有这三个文件。
frm :存储表结构,是任何存储引擎都具备的
myd:存储数据库文件
myi:存储索引文件
也是数据和索引是分开。
1、并发性与锁级别-表级锁
2、支持全文检索
3、支持数据压缩(压缩索引文件)myisampack -b -f testmysam.MYI
非事务型应用(数据仓库,报表,日志数据)
只读类应用
空间类运用(空间函数、坐标)
MySQL5.5以及以后版本默认存储引擎。
//查看表空间的类型
show VARIABLES like 'innodb_file_per_table'
ON:独立表空间:tablename.ibd 就是每一个表都有自己的空间。
OFF:系统表空间:ibddataX 所有的表共用一个表空间
MySQL5.6以前默认为系统表空间。
系统表空间和独立表空间区别
1、系统表空间无法简单的收缩文件大小。
2、独立表空间可以通过optimize table 收缩系统文件。
3、系统表空间会产生IO瓶颈。
4、独立表空间可以同时向多个文件刷新数据。
建议:Innodb使用独立表空间。
1、innodb是一种事务性存储引擎。
2、完全支持事务的ACID特性。
3、innodb支持行级锁(并发程度更高)
innodb适合于大多数OLTP应用。
数据以文本方式存储在文件。
.csv文件存储内容。
.csm文件存储表的单元数据如表状态和数据量。
.frm 表结构。
1、以CSV格式进行数据存储。
2、所有列都不能为null。
3、不支持索引(不适合大表,不适合在线处理)。
4、可以对数据文件直接编辑(保存文本文件内容)。
以zlib对表数据进行压缩,磁盘i/o更少,数据存储在ARZ为后缀的文件中。
1、只支持insert和select操作。
2、只允许在自增ID列上加索引。
使用场景:
日志和数据采集应用。
1、文件系统存储特点,也称HEAP存储引擎,所有数据保存在内存中。
2、支持HASH索引和BTree索引。
3、所有字段都是固定长度varchar(10)= char(10)。
4、不支持Blog和Text等大字段。
5、Memory存储引擎使用表级锁。
6、最大最小由max_heap_table_size参数决定。
使用场景:
1、hash索引用于查找或者是影射表(邮编和地区的对应表)。
2、用于保存数据分析中产生的中间表。
3、用于缓存周期性聚合数据的结果表
memory数据易丢失,所以要求数据可再生。
1、提供了访问远程MySQL服务器上表的方法。
2、本地不存储数据,数据全部放到远程服务器上。
3、本地需要保存表结构和远程服务器的连接信息。