mysql性能优化随笔
mysql性能优化是一个很大的命题,这里只记录一下近期的一些小经验。
曾经以为看了点create table时加index的语法就觉得自己知道怎么做mysql优化了,后来又看了点介绍mysql索引底层实现的文章,就感觉自己已经得到mysql精髓了一样。。
直到最近因为工作需要认真去提升大数据量下的性能的时候,才发现,自己以前简直跟从三到万里学了一二三就嚷嚷“儿得已”的三岁小儿一样的可笑。。
一、这里简单引用些资料介绍一些优化工具
神器1 https://dev.mysql.com/doc/refman/5.6/en/
官方文档手册,不需要解释。
神器2 explain
用这个看看自己的sql,经历哪些步骤,有没有使用到索引,不要想当然觉得建个索引mysql就能智能的到处使用,它有它的规则的,数据量大时有没有用到索引往往性能是天壤之别。参考资料:https://www.cnblogs.com/butterfly100/archive/2018/01/15/8287569.html
神器3 show engine innodb status\G
尤其推荐执行耗时很长的sql时看看最底下那里,mysql实际速度到底多少,它在忙哪类操作还是在发呆。。

另外可以看看buffer pool用的怎么样
神器4 show global status;
具体解释可以看这里 https://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html
神器5 了解mysql buffer pool
参考这里:https://www.cnblogs.com/coderyuhui/p/6861194.html
官方文档:https://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-pool.html
神器6 show full proccesslist;
查看当前正在执行的sql,也可以kill xxxx去杀掉query
二、最近使用的优化
实际操作中如何优化一定是结合业务场景来做的。例如少量写大量读的,可以用mysql一主多从、合理建索引、前面加一层redis等解决。这里只简单记录一点点
1. 合理使用索引
(1)建议使用组合索引,从explain可以看到一次子查询mysql只会选一个index使用,所以每个字段建一个索引最后也只会使用到其中一个而不是挨个去用。
(2)索引的字段不能太长,组合所有字段加起来长度在768字节以内才行,否则mysql自动取字段前xx字节
(3)把自己的sql用explain看看,确认一下mysql是怎么理解和执行的,是不是符合预期
(4)索引太多不见得好,会影响增删改的性能,以及造成数据膨胀,占用更多的磁盘空间。
2. 合理使用分区表
分区表的使用限制很多,多数情况下不推荐使用,但是刚好完全符合它的特性的时候建议果断用。用好了比自己分表要简单省事的多。
使用原则:
(1)所有查询都要指定分区字段,否则mysql就扫全表并且忽略所有索引
(2)合理的分区个数,底层是每个分区一套文件的,太多太少都不合适。当然自己分表也是一样要确定合理的分表个数。
(3)尽量应用在不需要alter table的场景里,alter table时如果分区较多,性能比普通表要慢很多。
3. 大数据量并且查询多的情况,尽量避免大数据量的join,可以加工制作宽表的方式进行优化。宽表上还可以建索引等。
4. 大批量关联update时,如果无法使用到索引,可以考虑是否方便先insert into select 然后delete老数据。当然这个办法更trick,一般场景是不建议使用的。不过trick的办法都是因地制宜想出来的,了解mysql特性并结合业务场景灵活运用就是好的设计。
mysql性能优化随笔的更多相关文章
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- Mysql性能优化三(分表、增量备份、还原)
接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...
- [MySQL性能优化系列]提高缓存命中率
1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...
- [MySQL性能优化系列]巧用索引
1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...
- MySQL性能优化:索引
MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...
- mysql 性能优化方向
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- MySQL性能优化总结
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- MYSQL性能优化的最佳20+条经验
MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论 131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...
- [MySQL性能优化系列]LIMIT语句优化
1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...
随机推荐
- 201271050130-滕江南-《面向对象程序设计(java)》第十六周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十六周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...
- Drop_out--防止过拟合
With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs ...
- lua 3 循环
while() do ... end i=10 while(i>0) do print(i) i=i-1 end repeat ... until() i=10 repeat print(i) ...
- cicros安装
1.下载与安装依赖包 wget https://github.com/libgd/libgd/releases/download/gd-2.2.5/libgd-2.2.5.tar.gz tar zxv ...
- 【day06】PHP
一.字符串函数库 1.安装 2. (1)strlen:获得字符串的字符长度 (2)substr:字符串截取 格式: string substr(string $var, ...
- JDK的小Bug你了解么?
用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨,依然坚持在一线上,是不是感觉很神奇,但是,有没有多 ...
- Wireshark使用入门
目录 1. Wireshark介绍 1.1 客户端界面 1.2 Display Filter 的常用方法 1.3 界面上一些小TIPS 2. 使用Wireshark分析TCP三次握手过程 2.1 三次 ...
- Linux学习 (2) CentOS 6 虚拟机挂载磁盘
1.我们先创建1台CentOS 6.10的虚拟机 2.使用SSH登陆CentOS虚拟机,运行下面的命令: sudo tail -f /var/log/messages ls -l /dev/sd* 可 ...
- Window权限维持(七):安全支持提供者
安全支持提供程序(SSP)是Windows API,用于扩展Windows身份验证机制.LSASS进程正在Windows启动期间加载安全支持提供程序DLL.这种行为使红队的攻击者可以删除一个任意的SS ...
- Abap内表
什么是内表:内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放. 定义类型:通过types开头定义 TYPES: BEGIN OF lin ...