mySQL性能测试
MySQL数据库介绍:
主流分支:
MariaDb
- MySql之父windenius创建,目标在于替换现有MySQl
- 兼容MySQl,对于开发者来说感知不到变化
- MariaDB is free and open source software
MySQl数据库重点监控指标:
QPS:
- Queries per seconds 每秒钟查询数量
- Show global status like ‘Question%’
- Queries/seconds
TPS:
- Tranaction per seconds
- TPS = (Com_commit + Com_rollback)/seconds
- Show global status like ‘Com_commit’;
- Show global status like ‘Com_rollback’
线程连接数:
- Show global status like’Max_used_connections’;
- Show global status like’Threads%’;
- Show variables like ‘max_connections’;
Query Cache:
- 查询缓存用于缓存select查询结果
- 当下次接收到相同查询请求时,不再执行实际查询处理而直接返回结果
- 适用于大量查询,很少改变表中数据
- 修改my.cnf
- 将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M
- 增加一行:query_cache_type = 0/1/2
- 如果设置为1,将缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存
- 如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询
- Show status like ‘Qcache%’;
- Query_cache_hits = (Qcache_hits/(Qcache_hits+Qcache_inserts))*100%
锁定状态:
- Show global status like ‘%lock%’
- Table_locks_waited/Table_locks_immediate 值越大代表表锁造成的阻塞越严重
- Innodb_row-lock-waits innodb行锁,太大可能是间隙锁造成的
主从延时:
- 查询主从延时时间: show slave status
慢查询定义:
- 执行速度超过定义的时间的查询
- 不同的系统定义不同的慢查询指标
慢查询开启:
- 编辑/etc/my.cnf, 在[mysqld]域中添加:
- 开启慢查询: show_query_log = 1
- 慢查询日志路径: slow_query_log_file = /data/mysql/slow.log
- 慢查询的时长: long-query_time= 1
- 未使用索引的查询也被记录到慢查询日志中
- log_queries_not_using_indexes = 1
慢查询日志分析:
Mysqldumpslow命令
- -s 是表示按照何种方式排序
a) –s –c : 访问计数
b) –s –l : 锁定时间
c) –s – r : 返回记录
d) –s –t : 查询时间
e) –s –al : 平均锁定时间
f) –s -ar : 平均返回记录
g) –s –at: 平均查询时间
- –t 是top n的意思,即为返回前面多少条的数据
- –g 后边可以写一个正则匹配模式,大小写是不敏感的
慢查询分析举例:
得到返回记录集最多的10个SQL
- Mysqldumpslow –s r –t 10 slow.log
得到访问次数最多的10个SQL
- Mysqldumpslow –s c –t 10 slow.log
得到按照时间排序的前10条里面含有左链接的查询语句
- Mysqldumpslow –s t –t 10 –g “left join” slow.log
SQl语句性能分析:
Explain执行计划:
- 用法explain select 语句
Explain结果分析:
Id:
- Id: select识别符,代表语句的执行顺序,一般在select嵌套查询时会不同
- Id列数字越大越先执行,如果说数字一样大,那么就从上往下一次执行
- Id列为null的就表示这是一个结果集,不需要使用它来进行查询
Select_type:
- Simple: 表示不需要union操作或者不包含子查询的简单select查询,有连接查询时,外层的查询为simple,且只有一个
- Primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary,且只有一个
- Union: union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
- Dependent union:与union一样,出现在union或union all语句中,但是这个查询要受到外部查询的影响
- Union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
- Subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
- Dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
- Derived: from子句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
- Table: 显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null; 如果显示为尖括号括起来的<derived N>就表示这个是临时表
- Type:从好到差依次是:sytem, const, eq_ref, ref, fulltext, ref_or_null, unique_subquery, index_subquery, range, index_merge, index, ALL
- Type:除了all之外,其他的type都可以使用到索引,除了index-merge之外,其他的type只可以用到一个索引
- Type中的:
a) System: 表中只有一行数据或者是空表,且只能用于myisam和memory表, 如果是Innodb引擎表, type列在这个情况通常都是all或者index
b) Const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const,其他数据库也叫做唯一索引扫描
c) eq_ref:出现在要连接多个表的查询计划中,驱动表只返回一行数据, 且这行数据是第二个表的主键或者唯一索引,且必须为not null, 唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
d) ref: 不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找,或者多列主键,唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现
e) fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
f) ref_or_null:与ref方法类似,只是增加了null值的比较,实际用的不多
g) unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值
h) index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重
i) range:索引范围扫描,常见于使用>,<,is null, between, in, like,等运算符的查询中
j) index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and, or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由与要读取多个索引,性能可能大部分时间不如range
k) index:索引全表扫描,把索引从头到尾扫描一遍,常见于使用索引列就可以处理不需要读取数据文件的查询,可以使用索引排序或者分组查询
l) all:这个就是全表扫描数据文件,然后在server层进行过滤返回符合要求的记录