发现问题常用命令:
1.show status; 查询服务器状态信息
show status like 'Com_select%';可以查询select的执行次数,insert等操作查询类同。
注意:如果一个查询的结果是从查询缓存中得到的,这会增加Qcache_hits,而不是Com_select。
show status 还可以指定统计范围。统计范围关键字分为GLOBAL和SESSION(或LOCAL)两种。
不加的话默认是session
eg:
2.show variable; 查询变量设置信息,可通过此变量查看各种变量是否设置正确。
用一个缓存变量的命令来举例:
- have_query_cache 表示是否支持query cache;
- query_cache_limit 表示query cache存放的单条query最大结果集,默认值为1M,结果集大小超过该值的query不会被cache;
- query_cache_min_res_unit 表示query cache 每个结果集存放的最小内存大小,默认4k;
- query_cache_size 表示系统中用于query cache的内存大小;
- query_cache_type 系统是否打开了query cache功能;
- query_cache_wlock_invalidate 针对myisam存储引擎,设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。
若要更全面的分析可以结合之前的 show status命令:
SHOW STATUS LIKE 'Qcache%';
参数含义:
Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。
Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。
Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。
Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。
Qcache_queries_in_cache:当前缓存中缓存的查询数量。
Qcache_total_blocks:当前缓存的block数量。
3. 用explain来分析sql的执行计划
用法:explain 后边跟select语句,分析语句的连接关系和连接顺序
需要关注的参数是下面这两个
select_type:select类型,它有以下几种值
A、simple 它表示简单的select,没有union和子查询
B、 primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary
C、union 指union语句的第二个或者说是后面那一个
D、subquery 指的是子查询的第一个select
type: 访问类型
性能由好到坏依次是
null>system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
all:全表扫描 ,index:索引全扫描 ,range:索引范围扫描 ,ref:使用非唯一索引扫描,或者唯一索引的前缀扫描,eq_ref唯一索引扫描,const/system:表单中最多只有一行匹配,null:不用访问表或者索引直接就能取到结果。。。。。
4.通过show profile分析sql
4.1首先要确认你的数据库支持
开启
4.2 show profile的用法
A、先执行语句
B、执行show profile,可以看到话费的总时间;
C、执行过程中线程的每个状态和消耗的时间
注:本章只是引导如何去发现问题,解决问题会在后面的博客中介绍。