一:查询语句分析

1.通过create index idx_colunmsName on tableName(columns)为某个表的某些字段创建索引,注意主键和唯一键都会自动创建索引;

如为表student的name和class字段创建联合索引:create index idx_name_class on student(name,class);

2.通过explain或describe来分析查询语句的效率和一些配置属性(临时表也是用这个方法且不需要加temporary关键字):

如:describe select* from student where uid=1;会输出如下几列:

1.id列,整个查询中select的位置;

2.select_type列,查询类型,一般都是simple;

3.table列,此查询对应的表;

4.type列,连接类型,该列中存储很多值,范围从const到all;

5.possible_keys列,很重要,指此查询语句里可能用到的索引;(注意,where条件里如果是两个判断是and,那么如果第一个

6.key列,很重要,指出此查询里实际用到的索引;(注意:并不是where里的字段有分配索引就会用到,如为name分配了索引在查询时也不一定会用,如两个条件or的情况,因此这个参数可以来看此select的索引是否生效)

补充:可以为一个字段创建多个索引,也可以为多个字段创建联合索引;

7.rows列,很重要,用来查看执行此查询所需要检验的 行数,越小越好;

8.key_len列,重要,使用的索引的长度,一般越小越好;

9.extra 中出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化。

extra 项 说明
Using filesort 表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL 中无法利用索引完成的排序操作称为“文件排序”
Using temporary 表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。

二:单表查询优化

1.先通过show variables like '%query_cache';显示的have_query_cache判断是否配置了高速缓存功能;

配置了不代表启用了,可以通过:set global query_cache_size = 102760448; 和set global query_cache_limit = 2097152; 和 set global query_cache_size = 600000;来开启高速缓存功能;

2.查询时用高速缓存功能:select sql_cache * from tableName;

三:多表查询优化

1)将多个分步查询合到一起执行

1.优化前:select name from class where sid=(select uid from student where name='silentdoer');

2.优化后:select cls.name from class as cls, student as stud where cls.sid=stud.uid and stud.name='silentdoer';

3.优化原理:将分步查询的结果整合成一个查询(即1里的要先执行后面的子查询然后再执行左边的查询),这样就不需要再执行多个单独查询(这个有点像C#的Linq的延时查询),从而提高了多表查询的效率;

2)将多个分步查询通过@var变量的形式缓存起来再执行第二步查询提高可读性和一定程度优化效率,和1)不一样的是这里有聚合函数故不能直接合成一个查询语句

1.优化前:select name from student where age > (select avg(age) from student);

2.优化后:select @average:=avg(age) from student;  select name from student where age > @average;

3.优化原理:2的方式能提高sql语句的可读性,试想一下假设1方式里如果继续嵌套子查询那理解起来就复杂多了;

速率的提高是依赖服务器变量能够一定程度上优化查询;

3)使用临时表优化查询

如存在这样的情况:student表数据量很大,那么直接对这张表的某个字段执行聚合函数如avg(score)那么会长时间占用大量资源;

因此可以引进临时表,将student的部分数据提取到这个临时表里(临时表可以只存score字段),然后通过insert into将student的记录的一部分存入临时表;

然后对此表执行avg,保存结果,然后再继续提取后面的记录,最终将一次性庞大的计算分解成多个小计算,最后在对这些小计算的结果做avg处理即可得到最终的目的;

1.创建临时表:create temporary table score_temp(id bigint primary key auto_increment not null, score int(11) not null);

2.将student的记录逐步存入临时表:insert into score_temp(score) select score from student limit 0, 1000;(下一次是1001, 2000)

3.对score_temp的score进行avg(score)得到结果缓存,然后清空临时表(可通过truncate table score_temp;来清空),继续...limit 1001, 2000;

4.对每次avg的结果再avg得到真正需要的结果;

注:临时表在关闭连接时会被删除;

四、线上问题排查

可以用show full PROCESSLIST;来查询最近的操作,其中主要字段的含义分别是(如果是Navicat可以Tool->服务器监控->MySQL自动刷新来监控,还可以右键点 结束进程 来杀掉某个查询):

1.command表示这个process正在做的事情,比如Quering;

2.time表示这个process持续的时间;

如果要杀掉某个数据库连接可以用kill processlist_id;

可以用下面的语句来获得那些超时了的连接所组成的kill id语句和其他一些信息(所以show processlist还可以用select* from information_schema.processlist来代替);

select concat('kill ', id, ';') as command, db, command as opr_type, time, state, info as `sql`
from information_schema.processlist
where lower(command) != 'sleep'
and time > 60 # 单位是秒
order by time desc

  

还可以用select* from information_schema.INNODB_LOCKS来看加锁情况

lock_type来查看是行锁还是表锁;

Mysql分析优化查询的方式的更多相关文章

  1. Django之ORM优化查询的方式

    ORM优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 ...

  2. Django【第28篇】:优化查询的方式

    优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 1 8 ...

  3. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

  4. mysql(一) 关联查询的方式

    mysql做关联查询时,一般使用join....on.....的语法. 但还有其它两种语法形式,三者的主要区别在于书写形式,其余方面并无太多差异. 如下三种形式: select * from trad ...

  5. MYSQL分析慢查询

    mysql慢查询的日志文件路径一般为: /var/lib/mysql/slowquery.log,具体的路径可以通过mysql配置文件(/etc/my.cnf)查询,slow_query_log_fi ...

  6. mysql分析慢查询日志工具mysqlsla安装

    1    配置perlperl -MCPAN -e shell cpan[1]>install Time:HiRescpan[1]>install File::Tempcpan[1]> ...

  7. 高性能Mysql笔记 — 优化

    性能优化 了解查询的整个生命周期,清楚每个阶段的时间消耗情况 性能分析 慢查询日志--服务器性能分析 参考 慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢 ...

  8. mysql性能优化-慢查询分析、优化索引和配置

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  9. [转]mysql性能优化-慢查询分析、优化索引和配置

    一. 优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在 ...

随机推荐

  1. subprocess.Popen在win10下会有异常

    win10运行下 会报740错误 查了下搜索结果 是uac问题 但uac已经是关闭状态 后直接使用os.popen进行替换 运行ok

  2. linq to sql语句中转换数据类型和日期操作

    System.Data.Entity.SqlServer.SqlFunctions.StringConvert System.Data.Entity.DbFunctions

  3. Windows下adobe Reader中pdf字体helvetica被替换为ArialMT

    笔者最近java项目中用itext-2.1.7导出pdf,使用了Helvetica,这个字体是内置的字体,本地Adobe Reader版本9.0 导出的文字是img.nur.cn实际效果 查看了pdf ...

  4. 认识Thymeleaf:简单表达式和标签 基础信息

    转载:https://www.cnblogs.com/beyrl-blog/p/6633182.html 本文只适用于不会Java对HTML语言有基础的程序员们,是浏览了各大博客后收集整理,重新编辑的 ...

  5. 快速掌握Ajax-Ajax基础实例(Ajax返回Json在Java中的实现)

    (转)实例二:Ajax返回Json在Java中的实现 转自http://www.cnblogs.com/lsnproj/archive/2012/02/09/2341524.html#2995114 ...

  6. Hadoop(三) HADOOP常用命令参数介绍

    -help 功能:输出这个命令参数手册 -ls                  功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注 ...

  7. 如何在angularjs里面选择一个按钮而不改变其他按钮的颜色

    var selectJson = { "background-color": "#FF0000", /* Green */ "border" ...

  8. Java的OOP三大特征之一——封装

    面向对象三大特征之一 封装  继承  多态   封装性就是把类(对象)的属性和行为结合成一个独立的相同单位,并尽可能隐蔽类(对象)的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系. ...

  9. idea窗口下方滚动条不明显设置

    在使用idea时,下方的滚动条老是显示不明显,每次点击拖拽都很费劲,在网上找了很多相关设置,最后确定了一个最好的办法解决问题: Shift (上档) +  鼠标滚动,这样就可以横向翻滚了,很方便 此方 ...

  10. mysql链接

    一 Mysql命令行连接 一般对于刚刚安装好的mysql,如果勾选启用mysql lineclient的话.可以直接通过找到开始---程序--- mysql command line client如下 ...