Mysql分析优化查询的方式
一:查询语句分析
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分析优化查询的方式的更多相关文章
- Django之ORM优化查询的方式
ORM优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 ...
- Django【第28篇】:优化查询的方式
优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 1 8 ...
- MySQL 执行优化查询
查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...
- mysql(一) 关联查询的方式
mysql做关联查询时,一般使用join....on.....的语法. 但还有其它两种语法形式,三者的主要区别在于书写形式,其余方面并无太多差异. 如下三种形式: select * from trad ...
- MYSQL分析慢查询
mysql慢查询的日志文件路径一般为: /var/lib/mysql/slowquery.log,具体的路径可以通过mysql配置文件(/etc/my.cnf)查询,slow_query_log_fi ...
- mysql分析慢查询日志工具mysqlsla安装
1 配置perlperl -MCPAN -e shell cpan[1]>install Time:HiRescpan[1]>install File::Tempcpan[1]> ...
- 高性能Mysql笔记 — 优化
性能优化 了解查询的整个生命周期,清楚每个阶段的时间消耗情况 性能分析 慢查询日志--服务器性能分析 参考 慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢 ...
- mysql性能优化-慢查询分析、优化索引和配置
一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1) max_connec ...
- [转]mysql性能优化-慢查询分析、优化索引和配置
一. 优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在 ...
随机推荐
- 如何查看Firefox中保存的登录密码
问:以前使用Firefox浏览器登录一个论坛,并且临时申请了一个账号,在使用Firefox登录时选择让它记住密码了,后来,我忘记了那个论坛的密码,但是可以使用Firefox直接登录.现在能不能查看密码 ...
- mysql 优化之一
提升速度 show variables like 'innodb_flush_log_at_trx_commit'; 会显示为1 set global innodb_flush_log_at_trx ...
- Codeforces 792B. Counting-out Rhyme
B. Counting-out Rhyme time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- KeyPress键盘按键ASCII值对应表
vbKeyLButton 1 鼠标左键 vbKeyRButton 2 鼠标右键 vbKeyCancel 3 CANCEL 键 vbKeyMButton 4 鼠标中键 vbKeyBack 8 B ...
- APM浅析
APM(Application Performance Management & Monitoring)一种基于云的性能监控服务(SaaS),以非侵入式监听探针,收集应用关键指标,生成分析报表 ...
- sqli-labs:5-6,盲注
思考1:当# --+都被过滤时,只能考虑闭合处理 思考2:union联合注入时必须先判断字段长度 eg. id=1' order by 3 and '1'='1 sqli5: 首先判断出对id经过了' ...
- Moving Average from Data Stream LT346
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- 微信小程序获取当前位置
详细参数说明请看小程序api文档:https://developers.weixin.qq.com/miniprogram/dev/api/wx.openLocation.html wx.getLoc ...
- 多种方式判断PC端,IOS端,移动端
1. 通过判断浏览器的userAgent,用正则来判断手机是否是IOS(苹果)和Android(安卓)客户端. var u = navigator.userAgent; var isAndroid = ...
- socket的同步异步的性能差别,以及listen的参数backlog
先说listen的参数backlog,同步系统中分别设置为5,512,1024的跑分情况 跑分工具apache的ab,参数为:ab -n50000 -c300 backlog=5跑分结果 Reques ...