面试宝典:性能测试经典面试题(四)
性能测试面试题及答案,上一期我们公布了性能测试经典面试题的第三部分,本期我们继续更新性能测试经典面试题的第四部分。
76、IO卷组结构
77、IO是否到达瓶颈的指标
关于IO监控的几个方面:
1.wa或%iowait的值不超过25%,如果超过表示磁盘存在问题
2.磁盘是否处于平衡状态
3.tps每秒传输次数
4.%tm_act的值建议不超过70%
5.avgrq-sz磁盘的队列长度
6.碎片率不能太高
78、mysql查询过程
79、char与varchar区别
char是一种固定长度的类型,varchar则是一种可变长度的类型
适用情况:
1、对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间;
2、对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利;
3、存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
4、固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
5、十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
80、如何设置慢查询
1.找系统中mysql的配置文件/ect/my.cnf
2.在my.cnf配置文件中的[mysqld]部分添加以下代码即可
//开启慢查询
log_slow_queries = ON
//慢查询日志文件所在位置
log-slow-queries = /var/run/mysqld/slow_querys.log
//设置慢查询的时间
long_query_time = 3
//没有使用索引的SQL语句也会被记录下来
log-queries-not-using-indexes
//管理员相关的操作也会被记录下来
log-slow-admin-statements
81、explain主要分析的内容
explain主要是用于分析我们执行的SQL语句,分析的信息主要包括:索引的使用、连接方式、是否全表扫描等相关信息。
82、mysql分析SQL响应时间和资源消耗
profile工具主要是用于分析SQL执行所消耗的响应时间和系统资源。
profile的语法如下:
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
83、如何监控mysql连接池
SHOW STATUS LIKE '%conn%'
SHOW STATUS LIKE '%abort%'
SHOW STATUS LIKE '%thread%'
SHOW STATUS LIKE '%bytes%'
84、mysql索引工作原理
索引的目的就是为了让查询的速度更快,索引对应着一张索引表,存储在引擎中。
在mysql数据库中常见的索引有三种:B-Tree索引、哈希索引、全文索引。
85、数据库调优数据结构的影响
选择数据类型通常应该遵守以下规则:
1.越小越好
所谓的越小越好是指数据类型所占的字节空间,即所占的内存情况。
2.数据类型越简单越好
通常来说越简单的数据类型,在处理时所消耗的CPU时间频率是最少的,数据类型越复杂,所消耗的CPU时间频率就会越长。例如时间、日期、IP地址等,之所以会这样是因为复杂的数据类型在比较时不是简单的ACSII比较,必须借用专门的函数来比较。
3.避免使用NULL
在定义表时,避免允许使用NULL,如果非要使用也是使用NOT NULL,因为NULL表示不是一个值,这样就不好比较。
86、mysql常见的查询优化方法
mysql常见查询优化的方法如下:
1. 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
2. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
3. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
4. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5. in 和 not in 也要慎用,否则会导致全表扫描
6. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
7. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
8. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
9. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定
87、mysql配置文件常见优化参数
配置文件中常见的选项内容:
default-storage-engine
表示默认的存储引擎
max_connections
表示允许最大的并发连接数,正常情况下这个值越大越好,但是如果过大,会让CPU无法处理,这些连接数会占用大缓存区。
back_log
相于队列长度,如果连接数超过max_connections,就将连接放入堆栈中,如果堆栈还是不够使用,那么客户端请求会被直接拒绝。
max_connect_errors
如果某台主机对服务器进行访问,如果出现错误的次数越过max_connect_errors,那么这台主机将会被禁访问服务器,如果需要解禁使用FLUSH HOST命令。
query_cache_size
表示查询缓存的大小,即查询缓存最多可以多少结果数据。
影响判断缓存大小是否够的两个参数:Qcache_free_memory和Qcache_hits如果Qcache_free_memory这个值很少,就说明查询缓存可能太小了,应该做设置大些Qcache_hits表示缓存命中率,如果这个值很大说明重复率很高,那么可以将查询缓存值设置大些。
query_cache_limit
表示单个查询所占的缓存大小,默认为1M。
open_files_limit
表示最多可以允许的打开文件描述符
table_open_cache
表示将打开表的数据放在缓存中,如果在缓存中找不到需要的数据才会到磁盘读书。
tmp_table_size
表示临时表的大小,如果临时的数据大于这个值,那么将存储将对磁盘进行操作。
read_buffer_size
mysql读入缓存的大小
join_buffer_size
表示使用join查询时,缓存的大小thread_cache_size
表示缓存中最多可以允许的线程数,如果连接未断开,后面发送的请求,会直接在缓存找到线程处理,不用重新增加新的线程。