范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

数据库系列MySQL慢查询分析和性能优化

  from:cnblogs.com/wzh2010/p/17091055.htm1 背景
  我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢。
  导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题。
  下面以MySQL为例子,我们从几个角度分析可能产生原因,并讨论解决的方案。 2 定位慢查询的原因并优化2.1 慢查询的分析
  开启SlowLog,默认是关闭的,由参数slow_query_log决定,在MySQL命令终端中输入下面的命令: # 是否开启,这边为开启,默认情况下是off set global slow_query_log=on;  # 设置慢查询阈值,单位是 s,默认为10s,这边的意思是查询耗时超过0.5s,便会记录到慢查询日志里面 set global long_query_time=0.5;  # 确定慢查询日志的文件名和路径 mysql> show global variables like "slow_query_log_file"; +---------------------+-------------------------------------------------------+ | Variable_name       | Value                                                 | +---------------------+-------------------------------------------------------+ | slow_query_log_file | /usr/local/mysql/data/MacintoshdeMacBook-Pro-slow.log | +---------------------+-------------------------------------------------------+ 1 row in set (0.00 sec)  # 检查慢查询的详细指标,可以看到下面 slow_query_log = ON,long_query_time = 0.5 ,都是因为我们调整过的 mysql> show global variables like "%quer%"; +----------------------------------------+-------------------------------------------------------+ | Variable_name                          | Value                                                 | +----------------------------------------+-------------------------------------------------------+ | binlog_rows_query_log_events           | OFF                                                   | | ft_query_expansion_limit               | 20                                                    | | have_query_cache                       | NO                                                    | | log_queries_not_using_indexes          | OFF                                                   | | log_throttle_queries_not_using_indexes | 0                                                     | | long_query_time                        | 0.500000                                             | | query_alloc_block_size                 | 8192                                                  | | query_prealloc_size                    | 8192                                                  | | slow_query_log                         | ON                                                   | | slow_query_log_file                    | /usr/local/mysql/data/MacintoshdeMacBook-Pro-slow.log | +----------------------------------------+-------------------------------------------------------+ 10 rows in set (0.01 sec)
  配置好之后,就会按照阈值默认把慢查询日志收集下来,可以到对应的目录下分析具体的慢请求原因。 2.2 使用Explain进行查询语句分析2.2.1 分析过程举例
  很多时候我们在评审RD同学代码和SQL脚本的时候,上下文和使用环境不了解,不能做出很准确的判断。
  这时候使用Explain分析SQL的执行计划就显得非常有用,拿到具体环境中Run一下就能看出很多问题。
  举个例子:
  模拟一个千万级别的雇员表,我们在没有做索引的字段上做一下查询看看,在500W数据中查询一个名叫LsHfFJA的员工,消耗 2.239S ,获取到一条id为4582071的数据。
  再看看他的执行计划,扫描了4952492 条数据才找到该行数据: mysql> explain select * from emp where empname="LsHfFJA"; +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       | +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ |  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL | 4952492 | Using where | +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 1 row in set
  这就是无索引或者索引不合理的结果,这个时候我们就可以根据实际情况进行查询优化了。 2.2.2 Explain需要关注的指标
  比较核心要关注的字段一般有 select_type、type、possible_keys、key、rows、Extra等
  我们来一个个说明: select_type:代表表示查询中每个select子句的类型,是简单查询还是联合查询还是子查询,一目了然。咱们上面的例子是SIMPLE,代表简单查询,其他枚举参考下列表格:
  select_type的值
  解释
  SIMPLE
  简单查询(不使用关联查询或子查询)
  PRIMARY
  如果包含关联查询或者子查询,则最外层的查询部分标记primary
  UNION
  联合查询(UNION)中第二个及后面的查询
  DEPENDENT UNION
  UNION中的第二个或后面的SELECT语句,取决于外面的查询
  UNION RESULT
  UNION的结果,union语句中第二个select开始后面所有select
  SUBQUERY
  字查询中的第一个擦讯
  DEPENDENT SUBQUERY
  子查询中的第一个查询,并且依赖外部查询
  DERIVED
  派生表的SELECT, FROM子句的子查询
  MATERIALIZED
  被物化的子查询
  UNCACHEABLE SUBQUERY
  一个子查询的结果不能被缓存,必须重新评估外链接的第一行 type:表示MySQL在表中查找所需数据的方式,也称"访问类型",咱们上面的例子是All,代表全表扫描,是非常差的模式,其他枚举参考下列表格:
  type的值
  解释
  system
  查询对象表只有一行数据,且只能用于MyISAM和Memory引擎的表,这是最好的情况
  const
  基于主键或唯一索引查询,最多返回一条结果
  eq_ref
  类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
  ref
  表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  fulltext
  全文检索
  ref_or_null
  表连接类型是ref,但进行扫描的索引列中可能包含NULL值
  index_merge
  利用多个索引
  unique_subquery
  子查询中使用唯一索引
  index_subquery
  子查询中使用普通索引
  range
  只检索给定范围的行,使用一个索引来选择行
  index
  Full Index Scan,index与ALL区别为index类型只遍历索引树
  ALL
  Full Table Scan, MySQL将遍历全表以找到匹配的行 possible_keys:应该或建议使用的索引
  表示MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。这个趋向于指导性作用。 key:实际使用的索引,没有的情况下为NULL
  显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL rows:预估扫描了了多少行,咱们上面的例子 4952492 ,非常不合理。
  表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。基本表现为实际扫描过的行数。 3 一些使用上的规范3.1 分析是否有不合理的查询
  ★ 以下是我们团队的准入规范,也是CodeReview 标准。 尽量避免使用select *,join语句使用select * 可能导致只需要访问索引即可完成的查询需要回表取数。
  一种是可能取出很多不需要的数据,对于宽表来说,这是灾难;一种是尽可能避免回表,因为取一些根本不需要的数据而回表导致性能低下,是很不合算。 严禁使用select * from t_name,不加任何where条件,道理一样,这样会变成全表全字段扫描。 MySQL中的text类型字段存储:不与其他普通字段存放在一起,因为读取效率低,也会影响其他轻量字段存取效率。大宽表、大字段表,整体性能也不好。如果不需要text类型字段,又使用了select *,会让该执行消耗大量io,效率也很低下 在取出字段上可以使用相关函数,但应尽可能避免出现 now() , rand() , sysdate() 等不确定结果的函数,在Where条件中的过滤条件字段上严禁使用任何函数,包括数据类型转换函数。大量的计算和转换会造成效率低下,这个在索引那边也描述过了。 分页查询语句全部都需要带有排序条件 , 否则很容易引起乱序 用in()/union替换or,效率会好一些,并注意in的个数小于300 严禁使用%前缀进行模糊前缀查询。 -- 如下,这种查询会导致扫描表: select a,b,c from t_name where a like "%name"; -- 可以使用%模糊后缀查询如: select a,b from t_name where a like "name%"; 尽量避免使用子查询,可以把子查询优化为join操作,通常子查询在in子句中,且子查询中为简单SQL(不包含union、group by、order by、limit从句)时,才可以把子查询转化为关联查询进行优化。子查询性能差的原因:子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能会受到一定的影响;特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。 在多表join中,尽量选取结果集较小的表作为驱动表,来join其他表。 分页查询,当limit起点较高时,可先用过滤条件进行过滤,如下。原理参考这篇 -- 如  select a,b,c from t1 limit 10000,20; -- 优化为: select a,b,c from t1 where id>10000 limit 20; 3.2 检查是否有不合理的索引使用
  建议参考笔者这篇《构建高性能索引(策略篇)》,比较完整 索引区分度(> 0.2)
  索引必须创建在索引选择性(区分度)较高的列上,选择性的计算方式为: selecttivity = count(distinct c_name)/count(*) ;
  如果区分度结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行 遵循最左前缀,将索引区分度最高的放在左边
  对于确定需要组成组合索引的多个字段,设计时建议将选择性高的字段靠前放。使用时,组合索引的首字段,必须在where条件中,且需要按照最左前缀规则去匹配。
  正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。 禁止使用外键,可以在程序级别来约束完整性 varchar、text类型字段如果需要创建索引,必须使用前缀索引。
  前缀索引计算公式如下,calcul_len 是数字,长度为1 ~ c_name字段的最长值,可以逐一比较,对比区分度最高的出来
  正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引。 select count(distinct left(`c_name`,calcul_len))/count(*) from t_name; 单张表的索引数量理论上应控制在5个以内。经常有大批量插入、更新操作表,应尽量少建索引,索引建立的原则理论上是多读少写的场景。 ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引 联合索引注意最左匹配原则:查询时必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。如: -- 如果建立(depno,empname,job)顺序的索引,job是用不到索引的。 depno=1 and empname>"" and job=1   应需而取策略,查询记录的时候,不要一上来就使用*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。 正确判断是否使用联合索引,应避免索引下推(IPC),减少回表操作,提升效率。 避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效。这是实际上就是需要保证索引所对应字段的"干净度"。 避免非必要的类型转换,字符串字段使用数值进行比较的时候会导致索引无效。 模糊查询"%value%"会使索引无效,变为全表扫描,因为无法判断扫描的区间,但是"value%"是可以有效利用索引。 索引覆盖排序字段,这样可以减少排序步骤,提升查询效率 尽量的扩展索引,非必要不新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
  举例子:比如一个品牌表,建立的的索引如下,一个主键索引,一个唯一索引 PRIMARYKEY (`id`), UNIQUEKEY `uni_brand_define` (`app_id`,`define_id`)
  实际场景中,建议代码交叉评审,当你同事业务代码中的检索语句如下的时候,应建议调整: select brand_id,brand_name from ds_brand_system where status=? and define_id=? and app_id=?
  建议改成如下: select brand_id,brand_name from ds_brand_system where app_id=? and define_id=? and status=?
  虽然说 MySQL的查询优化器会根据实际索引情况进行顺序优化,所以这边不做强制。但是同等条件下还是按照顺序进行排列,比较清晰,并且节省查询优化器的处理。 4 总结
  这边仅仅是从查询语句的角度进行分析,实际上缓存服务变慢的可能性很多,不仅仅是慢查询怎么分析(Slow Log、Explain命令)。还应该全面的分析原因,并给出处理方案,如 分析SQL脚本合理性、建立索引或优化索引、读写分离、垂直+水平分区)、多读少写/冷数据 做缓存、优化数据库的锁竞争、数据库配置调优、硬件资源升级 等等,后面几篇我们慢慢说。

李少莉事件愈演愈烈,官媒力挺文章被删!众多贵重首饰遭曝光李少莉事件用事实证明公众人物并不好当,而她本人也凭借一己之力将发言人这个行业推向了风口浪尖。如果职业能力没有达到标准的话,是真的不适合发言人这个岗位,没有一定的反应能力也容易翻船,小孩的身材,漂亮的脸?太瘦已经是现在女星最大灾难人们常说上镜会胖十几斤,镜头会显胖很多,所以娱乐圈的女明星们为了保持绝对好的效果,会用各种各样的方法进行身材管理。有人说如果在电视上感觉这个女孩特别瘦,那她现实生活中完全就是个骷髅尽管同为王菲的女儿,窦靖童和李嫣的人生却截然不同在粉丝们的心目中,王菲是一个神秘而又神秘的天后,她的声音充满了磁性,带着一种让人着迷的魅力。这种女人,注定不会是普通的,无论是职业还是婚姻。面对于爱情,她是无拘无束的,喜欢的时候,世界第一超模,18岁成名,26岁却因吸毒流浪街头,患艾滋病而死电影霓裳情挑里有个画面让人久久难忘。吉雅。卡兰芝在哀求母亲留在身边被拒绝后,暴怒地将母亲的东西摔出门外,还把母亲用力推了出去。门被呯地一声关上后,吉雅却靠着门瘫坐在地板上,放声大哭11月又加了两部剧!赵丽颖杨紫影视剧相继官宣11月观众福利来了,赵丽颖杨紫影视剧加入档期。说起来十一月也是好剧众多,继卿卿日常二八定律点燃我,温暖你天下长河谁都知道我爱你大博弈不期而至热播,梦华录无宣传二轮从网剧上星北京卫视大话西游2藏宝阁上架首只神兽心猿,12万人民币让人买不起一款游戏一生朋友,大家好,我是你们的老朋友老张头,这里是大话经典录像,每天为大家更新最新的牛图以及资讯,也会分享一些实用攻略,感谢大家的关注,咱们就看看今天要聊什么话题吧。全服第一王者荣耀世界新实机发布,是否能将原神拉下神坛?王者荣耀官方在2022共创之夜上公布了王者荣耀世界的全新实机演示,一起来欣赏一下吧。视频加载中官方原文新实机演示发布!入世界,览百态风景,见万物传奇淬体魄,执木兰重剑,化魔铠身躯踏今日分享好玩有趣的网站推荐今天搞几个好玩的游戏网站给大家分享分享1。人生模拟器httpsliferestart。syaro。iopublicindex。html这垃圾人生一秒也不想待了,想不想重开人生?让这王者近期英雄调整宫本猴子加强,李白调整是削弱还是加强?昨日体验服的英雄进行了调整,其中包括1。花木兰削弱,将花木兰的伤害进行了下调。2。宫本加强,增加了一重势基础伤害与等级成长伤害,并增加了二技能的护盾值。3。东皇削弱,东皇被动回复生永恒岛之彩虹回忆手游上线,如何快速提升战力?首先永恒岛手游中的强化系统是非常鸡肋的,因为强化石获取比较困难,并且在装备更换了之后无法转移继承强化等级,所以导致许多新手玩家在前期会浪费掉大量资源,导致后期有了更高级的装备之后没开发电子木鱼游戏可以积赛博功德吗?敲电子木鱼,积赛博功德。前段时间,一款电子木鱼游戏突然火起来。游戏本体十分简单,界面是黑色背景加一个简笔木鱼图标,玩法是点击屏幕敲击木鱼显示功德1。与其说它是一款游戏,不如说就是一
家有钱了,我爸70了想要学车,我不同意,这事僵着,怎么办呢?家有钱了,你爸70了想要学车很正常,你为什么不同意?交通法规规定70岁以上都可以考驾照,老人只要身体健康,就这点喜好,你还不同意?你担心但是你老爸心里有数。能开车时自然开,过几年年开车的坏习惯,哪个最难改掉?实话说都不好改。本人最讨厌变道不打灯,开车骑着车道线,加塞开车最坏的习惯就是自己可以,别人不行。自己随便怎么开怎么走及怎么影响别人都没有错。别人就不行,你看见了就会骂,嘲笑及爆怒。心理学家研究表明,人这一辈子最不快乐的是四十五到五十五这十年?你怎么看?或许是吧,当你在4555岁之间,发现世界空落落的,心里空落落的。往回看,无甚成绩,往前看,还有多少岁月等待着自己,如何办呢?青少年时,为作业为成绩,为大人的认可愁坏了心,但这个时候现在人工可以合成病毒吗?可以。陈薇院士的重组疫苗就是将新冠病毒的棘突嫁接到腺病毒上。腺病毒对人体有轻微毒性,若疫苗接种成功,人体免疫系统就可以产生真对新冠病毒棘突的特异抗体。理论上讲重组病毒就是一个新病毒澳大利亚留学圈是怎样的一种存在?我估计你就是一个托,不是做留学美国的就是做留学英国的中介,天天在贬低留学澳洲的学生,抢别的中介公司生意吧?澳洲国立大学,墨尔本大学,悉尼大学是响当当的大学,世界各种排名都在全五十,2022年3月以后,微信支付宝还能付钱吗?从2022年3月1号开始,个人收款码禁用于经营性服务,禁止个人静态收款码被用于远程非面对面收款,你可能以为它只是一张码的事,但是它背后的大棋局,一定是你想象不到的。首先各位审题能不世界顶级的奢侈羽绒服品牌有哪些?这些年,随着人们生活水平的改善和提高,品牌理念开始深入人心,大家越来越相信品牌的价值,更多人也开始关注奢侈品的消费,从包包到鞋子衣服甚至手机,奢侈品的概念无处不在,奢侈品不光能提升银行存款200万与每月领退休金8000,哪个更适合老人养老?你的意思是,要200万存款的话就没有退休金了是吗?如果是这样,我觉得我要是你,我就要200万,不要8000元,因为算一笔账就知道哪个更合适了。每月退休金8000,一年就是96000放5000块钱到基金里,不去管它,有可能会跌到零吗?放五千块到基金里,不去管它,基金是不可能跌到零的,当你的基金所买的股票跌破百分之五十时,基金管理委员会清盘这支基金,清算资产然后按持有比例平均返还!我在最早在07或08年时候买了一有人说物体的运动速度不能超过光速,那么宇宙的膨胀速度为什么大于光速?光子的运动速度,是具体物质的最大速度,虽然光与一般物体的运动形式不一样,但它脱离不了光子的来源物质电子是具体的物质的跃迁。而膨胀速度,是宇宙最初的总能量所给予。在迈克斯韦方程组中,谈谈防止10岁以下孩子发胖的好做法?1教孩子良好的饮食习惯。2多带孩子出去锻炼。3教孩子按时作息和睡眠。4给孩子科普肥胖有什么危害。首先,让孩子放慢吃饭速度这样可以防止孩子吃的太撑,而且每次吃完饭不要立即睡觉。其次,