MySQL之SQL查询优化

SQL查询优化

获取有性能问题的SQL

        通过用户

        通过慢查日志获取存在性能问题的SQL

        实时获取存在性能问题的SQL    

使用慢查询日志获取有性能问题的SQL

    slow_query_log 启动停止记录慢查日志(默认是关闭的)这个参数是动态的 可以通过set global来设置这个参数

        可以通过脚本来实现这个开关的控制

set global slow_query_log=on;

slow_query_log_file 指定慢查询日志的存储路劲及文件

    默认情况下保存在MySQL的数据目录当中,最好是将日志存储和数据存储分开

long_query_time  指定记录慢查日志SQL执行时间的伐值(可以精确到微秒),但是单位是秒

set global long_query_time = 0;

记录所有符合条件的语句

    包括查询语句 和 数据修改语句 已经回滚的SQL  默认值为10s ,通常为1毫秒

long_queries_not_using_indexes 是否记录未使用索引的SQL

实时获取有性能问题的SQL


这里可以通过一个SQL脚本周期性的执行这条SQL语句,这样就可以获取到实时监控SQL性能的效果

    select id,`user`,`host`,DB,command,`time`,state,info from information_schema.processlist;

SQL的解析预处理及生成执行计划

查询为什么会慢

        1.客户端发送SQL请求给服务器

        2.服务器检查时候可以在查询缓存中命中该SQL

                a.优先检查这个查询是否命中查询缓存中的数据(前提是查询缓存是否打开),检测缓存是否命中的时候都需要对缓存进行加锁操作

                    MySQL8.0已经取消了查询缓存,小型项目不想使用缓存的话可以建议在8.0以下的版本开启

                b.通过一个对大小写敏感的哈希查找实现的(要在查询缓存当中直接返回结果 是并不容易的)

                    Hash查找只能进行匹配

                 c.对于一个对写比较频繁的系统使用查询缓存可能会降低查询处理的效率

        3.服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

        4.根据执行计划,调用存储引擎API来查询数据

        5.将结果返回给客户端


MySQL依照上述的执行计划和存储引擎进行交互

这个阶段包括了多个子过程

    解析SQL,预处理,优化SQL执行计划

            语法解析阶段是通过关键字对MySQL语句进行解析,并生成一棵对应的"解析树"

            MySQL解析器将使用MySQL语法规则验证和解析查询

                        包括检查语法是否使用了正确的关键字

                        关键字的顺序是否正确等

            预处理阶段是根据目送去了规则进一步检查解析树是否合法

                        检查查询中所涉及的表和数据列是否存在及名字或别名是否存在歧义等等,如果不语法检查全部都通过了,查询优化器就可以生成查询计划了

            会造成MySQL生成错误的执行计划的原因(MySQL是基于其成本模型选择最优的执行计划)

                        统计信息不准确

                        执行计划中的成本估算不等同于实际的执行计划的成本

                        MySQL执行的最有计划与你认为的最优不一样

                        MySQL从不会考虑其他并发的查询,这可能会印象当前的查询速度

                        MySQL有时候也会基于一些固定的规则来生成执行计划

                        MySQL不会考虑不受其版本控制的成本

                                存储过程、用户自定义函数



MySQL优化器可优化的SQL类型

        重新定义表的关联顺序

                优化器会根据统计信息来决定表的关联顺序

          将外连接转化为内连接(也就是说并不是所有的left join和right join这种外连接都是以外链接方式来执行的【也就是出现外连接的效果等         同于内连接,外连接+where 】)

                    where条件和库表结构

        使用等价变换规则

                例如 where 5=5 and a>5优化为a>5

        优化count()、min()、max()

        将一个表达式转化为常数表达式

        使用等价变换规则(覆盖索引,所查询的数据中,索引包含了所有所需要查询的列 )

        子查询优化

                    将子查询转换为关联查询(减少查询的次数 )

        提前终止查询(查询的结果是不存在的),可以通过执行计划的扩展列可以知道

        对in()进行优化(在很多的SQL server中in的作用类似于or,但是MySQL不一样)

                MySQL会先对in中的条件进行排序,再通过二分查找判断该值是否满足条件,这样相对与其他的关系型数据库更快



确定查询处理各个阶段所消耗的时间

减少查询所消耗的时间加快查询的响应速度



使用profile



还可以配合其他的命令

例如

    show profile cpu for query 3;

在使用profile的时候,都会抛出警告,提示在以后的版本当中将不再使用profile,请使用Performance_Schema来进行替换

使用performance_schema

在5.6之后的版本建议开启这个功能


开启监控,使用performance_schema需要开启上面两项

如果开启performance_schema对于全局都是有效的





特定的SQL查询优化

大表的数据修改最好是分批处理


这是一个样本,在使用过程中,只需要修改红框部分就可以了




对大表结构的修改

        对表的列的字段类型进行修改和改变字段的宽度都是会进行锁表的

        无法接解决主从数据库延迟问题

                1.方案一:利用主从复制的架构,先在从服务器上进行修改,在进行主从切换(存在一定的风险),再对用原主(从)服务器进行修改

                2.方案二:先在主服务器上建立一个新表,新表的结构就是旧表进行修改过后的结构,再将老表的数据导入新表当中,并在老表中建立一系列的触发器,                 将老表中的数据同步到新表当中,当数据完成同步之后,再对老表添加一个排它锁并重新命名,最终删除老表

                    3.排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其                     他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。


这样可以减少加锁的时间,缺点就是操作比较复杂,但是可以通过工具来实现



使用汇总表优化查询


准们建立一个汇总表,在数据库服务器的工作量比较小的情况下进行


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335