一:查询语句分析

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. DataTable 作为ObjectDataSource的数据源

    好像是不能直接实现的.不过我从网上找到了这样的方法: 比如在BLL层中,SubjectManager是我对Subject表的业务类,此类中包含了Subject表的增删改查等各种方法.在aspx 页面中 ...

  2. docker搭建lnmp(二)

    上一篇利用 不同的命令来构建 nginx,mysql,php镜像 和 容器. 这样做比较麻烦,也很容易出错,当然可以写入 sh脚本来执行.但是可以通过 docker-compose 来达到效果,管理起 ...

  3. golang 创建一个简单的资源池,重用资源,减少GC负担

    package main; import ( "sync" "errors" "fmt" ) //代码参考<Go语言实战>中第7 ...

  4. 9.11 h5日记

      9.11   超链接标签<a></a>十分特殊改a标签内容的字体颜色,必须是直接给a 设置,给它的父级标签设置是不可行的.   PS:什么是属性继承,即父级标签设置的样式后 ...

  5. Liunx history

    Linux中history历史命令使用方法详解   (转) 作者:青藤园来源:|2012-05-10 10:     http://os.51cto.com/art/201205/335040.htm ...

  6. 探索未知种族之osg类生物---器官初始化一

    我们把ViewerBase::frame()比作osg这类生物的肺,首先我们先来大概的看一下‘肺’长什么样子,有哪几部分组成.在这之前得对一些固定的零件进行说明,例如_done代表osg的viewer ...

  7. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. 阿里云安骑士-Centos7系统基线合规检测-修复记录

    执行命令 sysctl -w net.ipv4.conf.all.send_redirects=0sysctl -w net.ipv4.conf.default.send_redirects=0sys ...

  9. 提升HTML5的性能体验系列之四 使用原生UI

    原生UI的设计目的 HTML和css有一个优势就是灵活的样式设计.在大多数情况下,我们都应该使用HTML+css来负责UI.但是有些情况下,我们发现HTML+css的UI不满足需求.1. 绝对置顶HT ...

  10. 清华大学 TUNA 协会

    https://tuna.moe/ 技术,实力,优越感,环境..,镜像