2019独角兽企业重金招聘Python工程师标准>>>

转发自:记一次mysql性能优化过程

由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在开源中国的个人空间。下面是这次优化的数据库版本:

案例一:粉丝查询优化

粉丝查询有2条sql

--查询所有粉丝
SELECT user FROM osc_friends f INNER JOIN osc_users u
ON u.id=f.user AND f.friend=? AND f.user<>? ORDER BY create_time DESC
--查询粉丝数量
SELECT COUNT(friend) FROM osc_friends f INNER JOIN osc_users u
ON u.id=f.user AND f.friend = ? AND f.user <> ?

这两个查询在业务可以优化,inner join一个osc_users表目的是去掉osc_friends里面自带了自己的userid,偏偏osc_users表是比较大的表,为啥这样设计,可以看看早年红薯分享的OSChina 用户动态设计说明

优化思路

简化sql,自带的userid的逻辑放到代码层去处理

优化后

SELECT user FROM osc_friends f WHERE f.friend=? ORDER BY create_time DESCSELECT COUNT(*) FROM osc_friends f WHERE f.friend = ?

sql简化了很多,大大提升了查询速度

小结

有时候业务处理放到代码层,能达到意想不到的效果

案例二:私信优化

SELECT MAX(id) AS id, COUNT(id) AS msgCount
FROM osc_msgs WHERE user = 12 GROUP BY friend ORDER BY id DESC

osc_msgs表存储着所有的私信纪录,随着时间推移,该表慢慢变大,一次查询成本变高,基本都要1秒多

优化思路

取私信表的最新的两个人的对话放入一个新建的osc_last_msgs表,每次发私信更新osc_last_msgs表,这个表只记录最新的私信,这样优化后的私信列表sql就不需要在msg表里面找数据,只需要去osc_last_msgs表寻找.

优化后

SELECT * FROM osc_last_msgs WHERE user=? ORDER BY msg_id DESC

小结

把数据量从大化小的典型案例

案例三 评论优化

SELECTl1.id
FROMosc_opt_logs l1,osc_opt_logs l2
WHEREl1.obj_type IN (101, 111, 113, 116, 119, 121)
AND l2.obj_type IN (100,110,112,114,118,120,123,124,122,125,126,127,99
)
AND l1.parent_id = l2.id
AND l2. USER = 12
ORDER BYl1.id DESC
LIMIT 20;

尝试建立联合索引进行优化,不过效果不佳,因为optlog表特别的大,因此联表查询效率极低,占用查询缓存空间极大。

优化思路

添加一个reply_user字段,将回复的动弹进行标记,这样子就可以简化整个联表查询操作

优化后

SELECT id FROM osc_opt_logs where reply_user = 12 ORDER BY id DESC limit 20;

小结

适当的冗余字段可以降低sql的复杂度

案例四 索引优化

索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一般很快。所以优化语句基本上都是在优化rows。

一般来说.

  • rows<1000,是在可接受的范围内的。
  • rows在1000~1w之间,在密集访问时可能导致性能问题,但如果不是太频繁的访问(频率低于1分钟一次),又难再优化的话,可以接受,但需要注意观察
  • rows大于1万时,应慎重考虑SQL的设计,优化SQL

这个没有绝对值可参考,一般来说越小越好,,如果100万数据量的数据库,rows是70万,通过这个可以判断sql的查询性能很差,如果100万条数据量的数据库,rows是1万,从我个人的角度,还是能接受的。

另外就是extra的信息,该列包含MySQL解决查询的详细信息 ,重点关注出现关键字:

Using filesort:当Query 中包含order by 操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。

Using temporary:在某些操作中必须使用临时表时,在 Extra 信息中就会出现Using temporary ,主要常见于 GROUP BY 和 ORDER BY 等操作中

当执行计划Extra 出现Using filesort 、Using temporary 时,可以考虑是否需要进行sql优化和调整索引,最后再调整my.cnf 中与排序或者临时表相关的参数,如sort_buffer_size或者tmp_table_size.

比如下面这个:

原因是mysql查询只使用一个索引,如果where字句用了索引的话,那么order by 中的列是不会使用索引的。所以order by的条件也需要添加到索引里面组成联合索引,优化后

还有一个需要注意的点是,索引有个最左前缀的原则:联合索引(a,b,c)可以匹配(a)、(a,b)、(a,b,c)但不可以匹配(b,c)

小结

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

案例五 关注数据库状态

当满满期待优化后有大幅度性能提升的时候,现实总是跟你开玩笑,经过测试检查,发现不是sql的问题,有可能是跟服务器有关,用top命令看了发现mysql进程的cpu占用率一直在100%左右,这就奇怪了,用show processlist看了一下mysql的进程,发现一个可疑的sql一直在执行,kill 掉后cpu占用率马上下来了

小结

当你发现数据库cpu或者io有异常现象时候,用show processlist看看数据库在忙什么

写在最后

经过这次优化,个人空间打开速度提升了,总结几条心得:

1.不要指望所有SQL语句都能通过SQL优化,业务上的调整带来意想不到的效果;

2.所有的性能优化都是空间换时间,通过冗余来提高性能,大体思路都是大化小,分而治之

3.explain是sql优化的入门

4.索引利大于弊,多用,善用之

如果再卡,可能会从分库分表,读写分离这方面入手了。

优化前跟优化后的mysql是大大的不同,同样用mysql,支撑起了淘宝,腾讯,facebook,但却对你的业务系统支撑起来很吃力?

以上不正之处请指出。

转载于:https://my.oschina.net/anxiaole/blog/852276

记一次mysql性能优化过程相关推荐

  1. mysql minus_10.24程序员节,喜得一套「MySQL性能优化金字塔法则」

    明天就是10.24程序员节了,这么重大的节日怎么能少得了我来凑热闹呢!这不,最近都在研究MySQL性能优化,偶得朋友相赠一套[MySQL性能优化金字塔法则],简直就是深得我心呐~于是乎,就成就了咱今天 ...

  2. MySQL 性能优化,优化设计及设计原则解读

    MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...

  3. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

  4. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  5. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...

  6. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

  7. MySQL性能优化点记录

    第一章 myisam,可以基于blob和text的前500字节,创建索引 myisam 支持fulltext 延迟更新索引 (delay_key_write) CREATE TABLE `table3 ...

  8. [官方] mysql 性能优化文档(中英文自译)

    大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...

  9. mysql 性能优化 20 条建议

    MySQL性能优化的最佳20+条经验 2009年11月27日陈皓发表评论阅读评论100,946 人阅读     今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库 ...

最新文章

  1. @data注解_聊一下@Conditional注解系列的作用
  2. VTK:vtkCaptionActor2D用法实战
  3. 实验一  简单词法分析程序设计
  4. objective-c 类目(Category)和延展(Extension)
  5. c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
  6. 唯有自己变得强大_真正的自立,唯是让自己变得更加强大
  7. Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
  8. 统一沟通-技巧-9-Lync 2010-Outlook 2010-自动配置-1-IT人员
  9. linux字符串处理命令,linux 命令之 字符串处理命令——paste
  10. WPF Prism框架介绍
  11. Pano2VR制作全景图子菜单导航
  12. e盘是否具有读写权限_文件权限管理
  13. 【240】python 一个二维数组和一个整数,判断数组中是否含有该整数
  14. 解决:禁止访问 (403) CSRF验证失败
  15. linux服务器安装mysql步骤详解
  16. php应该安装在c盘,vscode要装在c盘吗
  17. Python的整数与浮点数计算
  18. 高级前端架构师必备技能(marksheng)
  19. [SIM]MT6572在研发过程中,突然不识别SIM2
  20. 小麦知识图谱三元组构建

热门文章

  1. AI开放只是幌子?科技巨头边承诺开放边申请专利
  2. 著名物理学家斯蒂芬•霍金去世,他曾告诫人类要学会避免人工智能可能的风险
  3. 两个黑箱问题 ——深度神经网络和脑神经网络
  4. “拒绝在 iPad 上运行 Xcode!”
  5. 大厂 CEO 一年薪酬拿多少?
  6. 卫星数据现已加入 Azure 豪华套餐,在太空向女神表个白?
  7. @程序员,什么键盘最耐用?| 每日趣闻
  8. 桂林机场春运期间新增多条航线航班 实现接力承运无缝衔接
  9. Linux常用命令大全-toolfk程序员在线工具网
  10. Confluence 6 配置管理员会话安全的备注