小言_互联网的博客

Python全栈(三)数据库优化之8.MySQL高级-存储引擎和基准测试

224人阅读  评论(0)

一、MySQL引擎之MyISAM

面对不同的需求,选择不同的存储引擎。

create table enginetest(id int) engine='myisam';

1.定义

MyISAM是MySQL5.5之前版本的默认存储引擎。
MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成。

2.特性

锁的作用:
管理共享资源的并发访问;
实现事务的隔离性。
锁的类型:

  • 共享锁(读锁):
    针对同一份数据,多个读操作可以同时进行而不会互相影响。
  • 独占锁(写锁):
    当前写操作没有完成前,它会阻断其他写锁和读锁。

锁的粒度:

  • 表级锁
  • 行级锁

MyISAM存储引擎的特性:
(1)并发性与锁级别:
使用表级锁,并发性较低;
(2)表损坏修复:
check语句检查表的状态,repair语句来修复表的状态。

check table test;

打印

+-----------+-------+----------+----------+
| Table     | Op    | Msg_type | Msg_text |
+-----------+-------+----------+----------+
| demo.test | check | status   | OK       |
+-----------+-------+----------+----------+
1 row in set (0.20 sec)
repair table test;

打印

+-----------+--------+----------+----------+
| Table     | Op     | Msg_type | Msg_text |
+-----------+--------+----------+----------+
| demo.test | repair | status   | OK       |
+-----------+--------+----------+----------+
1 row in set (0.31 sec)

(3)MyISAM表支持数据压缩:
命令:myisampack -b -f myIsam.MYI
为Linux命令,Windows不支持。
存储引擎限制:
版本 < MySQL5.0时默认表大小为4G,如存储大表则要修改MAX_Rows和AVG_ROW_LENGTH;
版本 > MySQL5.0时默认支持256TB。

3.适用场景:

(1)非事务型应用:
不支持事务场景适合。
(2)只读类应用:
读取较快,适合于只读应用。

二、MySQL引擎之InnoDB

1.定义

InnoDB是MySQL5.5之后版本的默认存储引擎。
InnoDB支持事务的ACID特性。
InnoDB使用表空间进行数据存储:
innodb_file_per_table的值表示存储的表空间类型:
on:独立表空间,tablename.ibd,是默认的;
off:系统表空间,ibdaraX(X是一个数字)。
通过以下语句查看数据库的表空间类型:

show variables like 'innodb_file_per_table';

打印

+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set, 1 warning (0.01 sec)

通过以下语句修改类型:

set global innodb_file_per_table=off;

打印

Query OK, 0 rows affected (0.00 sec)

命令行修改,只是临时修改,不会永久性改变,重启数据库会恢复默认;
配置文件修改,会永久修改。
系统表空间和独立表空间的选择:
系统表空间会产生IO瓶颈,刷新数据的时候是顺序进行的,因此会产生文件的IO瓶颈;
独立表空间可以同时向多个文件刷新数据,一般情况下会选择独立表空间。

2.InnoDB存储引擎的特性:

(1)支持事务的ACID特性;
(2)支持行级锁,可以最大程度地支持并发。

MyISAM和InnoDB的对比:
如图

三、MySQL引擎之CSV

1.文件系统存储特点:

数据为以文本方式存储在文件中;
.csv文件存储表内容;
.csm文件存储表的元数据如表状态和数据量;
.frm文件存储数据表结构信息。

2.特点:

(1)以csv格式进行数据存储:
可以通过Excel或其他对csv文件编辑的方式对数据进行编辑,编辑后在命令行中通过flush tables;命令进行刷新数据再查看,但是一般不建议通过这种方式编辑数据,因为在其他方式(如命令行、可视化界面)编辑等同时存在时会产生同步的延迟和数据错误等问题。
(2)不支持自增。
(3)不支持索引。
(4)不支持空字段。

3.使用场景:

适合作为数据交换的中间表。

四、MySQL引擎之Memory

1.定义

也称HEAP存储引擎,数据保存在内存中,如果MySQL服务重启数据会丢失,数据表结构会保存下来。

2.功能特点

(1)支持HASH索引和BTREE索引:
hash索引一般用于等值查找,btree一般用于范围查找。
Memory支持两种索引,其他引擎只支持btree,所以可为Memory数据表指定索引类型。
查看表索引:

show index from test_memory;

打印

+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table       | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test_memory |          0 | PRIMARY  |            1 | id          | NULL      |           0 |     NULL | NULL   |      | HASH       |         |               |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)

指定新的索引类型:

create index idx_name using btree on test_memory(name(31));

打印

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

再次查看索引

show index from test_memory;

打印

+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table       | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test_memory |          0 | PRIMARY  |            1 | id          | NULL      |           0 |     NULL | NULL   |      | HASH       |         |               |
| test_memory |          1 | idx_name |            1 | name        | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |               |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

(2)所有字段都为固定长度varchar(10)=char(10);
(3)不支持BLOB和TEXT等大字段;
(4)Memory存储引擎使用表级锁。

3.选择存储引擎

除非需要使用到某些InnoDB不具备的特性,并且没有其他办法可以代替,否则都应该优先选择InnoDB引擎,并且一般情况下不要混用
应用举例:

  • 事务:
    如果应用需要事务支持,那么InnoDB(或者XtraDB)是目前最稳定并且经过验证的选择;
  • 备份:
    如果可以定期地关闭服务器来执行备份,那么备份的因素可以忽略;反之,如果需要在线热备份,那么选择InnoDB就是基本的要求。
  • 崩溃恢复:
    MyISAM崩溃后发生损坏的概率比InnoDB要高很多,而且恢复速度也要慢。

4.应用举例:

日志型应用:
MyISAM,因为大部分只读和插入,速度较快。
只读或大部分情况只读的表:
MyISAM,读取较快。
订单处理:
InnoDB,涉及到事务和资金处理。

五、基准测试

1.定义

基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以评估变化对性能的影响。
基准测试是针对系统设置的一种压力测试。

2.基准测试特点

基准测试特点:
直接、简单、易于比较,用于评估服务器的处理能力;
可能不关心业务逻辑,所使用的查询和业务的真实性可以和业务环境没关系。
压力测试特点:
对真实的业务数据进行测试,获得真实系统所能承受的压力;
需要针对不同主题,所使用的数据和查询也是真实用到的。
基准测试是简化的压力测试

3.基准测试的目的

建立MySQL服务器的性能基准线,确定当前MySQL服务器运行情况,确定优化之后的效果;
模拟比当前系统更高的负载,已找出系统的扩展瓶颈,可以增加数据库并发,观察QPS(每秒处理的查询数),TPS(每秒处理的事务数)变化,确定并发量与性能最优的关系;
测试不同的硬件、软件和操作系统配置;
证明新的硬件设备是否配置正确。

4.如何进行基准测试

对整个系统进行基准测试:
优点:

  • 能够测试整个系统的性能,包括web服务器缓存、数据库等;
  • MySQL并不总是出现性能问题的瓶颈,如果只关注MySQL可能忽略其他问题,能反映出系统中各个组件接口间的性能问题,体现真实性能状况。

缺点:

  • 测试设计复杂,消耗时间长。

对MySQL进行基准测试:
优点:

  • 测试设计简单,所耗费时间短;

缺点:

  • 无法全面了解整个系统的性能基线。

5.MySQL基准测试的常见指标

(1)TPS:
单位时间内处理的事务数
MySQL中查询语句为

--提交事务速率查询
show global status like 'Com_commit';

打印

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_commit    | 0     |
+---------------+-------+
1 row in set (0.01 sec)
--回滚事务速率查询
show global status like 'Com_rollback';

打印

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_rollback  | 0     |
+---------------+-------+
1 row in set (0.00 sec)

(2)QPS:
单位时间内处理的查询数
MySQL中查询语句为

show global status like 'Question%';

打印

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Questions     | 436   |
+---------------+-------+
1 row in set (0.00 sec)  

6.MySQL基准测试工具

mysqlslap:

MySQL5.5以后自带,可以模拟服务器负载,并输出相关统计信息。
常用参数说明:

  • auto-generate-sql 由系统自动生成SQL脚本进行测试
  • auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
  • auto-generate-sql-load-type 指定测试中使用的查询类型 读写或者混合,默认是混合
  • auto-generate-sql-write-number 指定初始化数据时生成的数据量
  • concurrency 指定并发线程的数量 1,10,50,200
  • engine 指定要测试表的存储引擎,可以用逗号分割多个存储引擎
  • no-drop 指定不清理测试数据
  • iterations 指定测试运行的次数 指定了这个不能指定no-drop
  • number-of-queries 指定每一个线程执行的查询数量
  • debug-info 指定输出额外的内存及CPU统计信息
  • number-int-cols 指定测试表中包含的INT类型列的数量
  • number-char-cols 指定测试表中包含的varchar类型的数量
  • create-schema 指定了用于执行测试的数据库的名字
  • query 用于指定自定义SQL的脚本
  • only-print 并不运行测试脚本,而是把生成的脚本打印出来
    测试举例:
    mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --aut o-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=test –uroot -proot | more
    结果为
Benchmark
        Running for engine myisam
        Average number of seconds to run all queries: 0.000 seconds
        Minimum number of seconds to run all queries: 0.000 seconds
        Maximum number of seconds to run all queries: 0.000 seconds
        Number of clients running queries: 1
        Average number of queries per client: 10

Benchmark
        Running for engine myisam
        Average number of seconds to run all queries: 0.036 seconds
        Minimum number of seconds to run all queries: 0.031 seconds
        Maximum number of seconds to run all queries: 0.047 seconds
        Number of clients running queries: 50
        Average number of queries per client: 0

Benchmark
        Running for engine myisam
        Average number of seconds to run all queries: 0.056 seconds
        Minimum number of seconds to run all queries: 0.046 seconds
        Maximum number of seconds to run all queries: 0.062 seconds
        Number of clients running queries: 100
        Average number of queries per client: 0

Benchmark
        Running for engine myisam
        Average number of seconds to run all queries: 0.140 seconds
        Minimum number of seconds to run all queries: 0.109 seconds
        Maximum number of seconds to run all queries: 0.187 seconds
        Number of clients running queries: 200
        Average number of queries per client: 0

Benchmark
        Running for engine innodb
        Average number of seconds to run all queries: 0.010 seconds
        Minimum number of seconds to run all queries: 0.000 seconds
        Maximum number of seconds to run all queries: 0.016 seconds
        Number of clients running queries: 1
        Average number of queries per client: 10

Benchmark
        Running for engine innodb
        Average number of seconds to run all queries: 0.401 seconds
        Minimum number of seconds to run all queries: 0.063 seconds
        Maximum number of seconds to run all queries: 1.063 seconds
        Number of clients running queries: 50
        Average number of queries per client: 0

Benchmark
        Running for engine innodb
        Average number of seconds to run all queries: 0.458 seconds
        Minimum number of seconds to run all queries: 0.125 seconds
        Maximum number of seconds to run all queries: 1.125 seconds
        Number of clients running queries: 100
        Average number of queries per client: 0

Benchmark
        Running for engine innodb
        Average number of seconds to run all queries: 0.313 seconds
        Minimum number of seconds to run all queries: 0.313 seconds
        Maximum number of seconds to run all queries: 0.313 seconds
        Number of clients running queries: 200
        Average number of queries per client: 0

sysbench:

可参考https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html

欢迎大家加入群聊【python知识交流分享群】,进行技术交流:https://jq.qq.com/?_wv=1027&k=5m5AduZ


转载:https://blog.csdn.net/CUFEECR/article/details/103552890
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场