关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »浅析如何定位,排除和避免MySQL性能故障

    浅析如何定位,排除和避免MySQL性能故障

    2015-06-29 00:00:00 出处:ITJS
    分享

    首先是如何检查SQL的效率.

    1.善用explain:

    设计SQL后,应使用explain命令检查SQL,看是否使用到索引,是否存在filesort,重点检查检索的行数(rows)是否太大。

    一般来说.

    rows<1000,是在可接受的范围内的。

    rows在1000~1w之间,在密集访问时可能导致性能问题,但如果不是太频繁的访问(频率低于1分钟一次),又难再优化的话,可以接受,但需要注意观察

    rows大于1万时,应慎重考虑SQL的设计,优化SQL,优化db,一般来说不允许频繁运行(频率低于1小时一次)。

    rows达到10w级别时,坚决不能做为实时运行的SQL。但导数据场合除外,但导数据必须控制好时间,频度。

    explain SQL语句应该是日常开发中的习惯动作,有时explain出来的结果,可能会出于偏离设计的意料之外,所以

    **强烈建议在设计SQL,尤其是稍微复杂的SQL时,一定要在测试环境甚至是实际环境上预先进行explain**

    2.MySQL慢查询日志

    一般应打开MySQL的慢查询日志(在my.cnf中加入log_slow_queries和long_query_time两个参数),会记录所有查询持续时间超过long_query_time的SQL语句,把这些语句log下来之后,再一一分析(explain)优化。

    3.监视当前进程

    登陆MySQL,使用show processlist查看正在运行的SQL语句,如果正在运行的语句太多,运行时间太长,表示MySQL效率有问题。必要的时候可以将对应的进程kill掉。

    4.系统命令

    使用top/vmstat等系统命令来检查MySQL进程占用的cpu,内存,以及磁盘IO量。

    对MySQL优化的文章很多,这里只提几点平时工作中比较常用到的方法。

    ◆建表时,显式指定使用innodb数据库引擎,而不是myisam,myisam引擎的锁是表锁,读锁和写锁是互斥的,读写操作是串行的,锁冲突会严重影响并发.而innodb提供行级锁,能提供较好的并发表现,在我们的业务场景里,也不会引起死锁。

    ◆善用索引,对SQL语句where条件里使用到的字段,合理建立索引。虽然对表建立索引一定程度上会影响写入效率,但在表数据规模不大,写入压力不是特别高的情况下,索引带来的好处是更多的。

    ◆当SQL语句是由代码动态生成的,如在运行时根据用户操作加入不同的where参数,应在测试阶段对SQL生成的典型情况和边界情况进行测试,看是否有可能造成性能问题。并应适当生成一些日志,供提取最终生成的SQL进行效率分析。

    ◆对数据应合理分库分表,由应用层去动态的选择库和表。MySQL的innodb表虽然理论上可以装海量的数据,但在我们的业务场景下,数据控制在500w以下会比较合理,追求性能的话,最好控制在200w以下,合理索引。

    ◆需要联合查询时善用left join/right join而不是直接多表联合,怎么用,查manul ^_^ 

    ◆尽量不要使用select套select的复合查询,如果能拆开,尽量拆开,多条精悍的SQL,组合起来可能就是一条庞大的SQL,应该避免。

    ◆善用cache,将不常修改的,数据量有限的,又是被密集查询的信息,加载到cache里,可以有效的降低数据库压力。在一般的业务场景里,推荐使用开源memcache,简单高效。

    ◆如果一些逻辑可以放到应用层去完成,可以考虑放到应用层去完成。但如果将SQL逻辑分拆到应用层可能导致对数据更频繁的访问的话,那么需要考虑修改应用逻辑,数据结构,或回到合理的联合查询上来。

    比如某些数据的排序可以load到php数组里,再sort.又比如需要查询A,B两个表,A表里的数据是B表里某个字段的对照说明(如A:t_service表,B.t_task表),A表数据量有限,可以做联合查询,也可以先将A表先load到进程或内存里,用hash结构cache起来,再查B表,然后在cache里依次查询hash,获得对照说明。

    ◆关于导数据和统计性查询.导数据在计算和磁盘io上对数据库压力都会很大,应在时间和空间上合理分摊数据库压力如果需要导出批量的特定数据做分析,应建立专供数据分析的数据库服务器,或者建立临时库表,先导出数据,再在上面做分析运算。

    导数据等可能引起批量数据读取的操作,应建立定时任务,在数据库不繁忙的时段(凌晨1~7时)运行一般的统计操作,对实时性要求都不会太高(5~10分钟以上,甚至一天,一周等),这种数据不应在每次访问时运行库中直接count,group,而是应该由定时任务导出,建立结果表或中间结果表,供最终用户使用。

    ◆生产数据库上的操作权限应严格控制,而开发人员在生产数据库上直接运行SQL语句,要尽量慎重。

    能做到以上这些,基本上可以算MySQL以及相关系统优化入门,可以保证不要让我们的数据库整天累趴下了。

    最后,即使做足了功课,也还是要例行的对数据库运行情况进行观察,监控,尽早发现其性能瓶颈,在未造成危害前解决掉。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Edge浏览器百度被劫持/篡改怎么办,地址后边跟着尾巴#tn=68018901_7_oem_dg

    Google Chrome 在 iPhone 上新增了 Safari 数据导入选项

    Windows 11专业版 KMS工具激活产品密钥的方法

    DEDECMS安全策略官方出品

    Microsoft Text Input Application 可以关闭吗?

    新版本QQ如何关闭自带的浏览器?

    C++编程语言中continue的用法和功能,附举例示范代码

    c++ map 的数据结构、基本操作以及其在实际应用中的使用。

    C语言如何避免内存泄漏、缓冲区溢出、空指针解引用等常见的安全问题

    C语言中的break语句详解

    IT头条

    马斯克2026最新采访总结:2040年,全球机器人数量将突破100亿台

    23:52

    专家解读|规范人工智能前沿业态健康发展的新探索:解读《人工智能拟人化互动服务管理暂行办法》

    00:54

    用至强 6高存力搞定MoE卸载!

    17:53

    美国将允许英伟达向中国“经批准的客户”出售H200 GPU

    02:08

    苹果与微信就15%手续费达成一致?腾讯未置可否

    22:00

    技术热点

    PHP 和 Node.js 的10项对比挑战

    Javascript闭包深入解析及实现方法

    windows 7、windows 8.1手动增加右键菜单功能技巧

    MYSQL出错代码大汇总

    windows 7假死机怎么办 windows 7系统假死机的原因以及解决方法

    Ubuntu(Linux)下配置IP地址的方法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。