高效mysql的习惯(程序员版本)
高效的mysql
- 一定要有主键
- 如果没有主键:
- 数据多次读写后可能更离散,有更多随机I/O
- MySQL复制环境中,如果选择RBR模式,没有主键的update需要读全表,导致复制延迟
- 如果没有主键:
- 好的主键特点:
- 没有业务用途
- 数值呈连续增长,最好是自增
- 坚决不能选用CHAR/UUID等类型
- 关于数据长度
- 够用前提下,越短越好
- 消耗更少的存储空间
- 需要进行排序时,消耗更少的内存空间
- 例如用INT UNSIGNED存储IPV4地址,不用CHAR(15)类型
- 案例:11个字符长度的数值,bigint vs char(120) vs char(11),1万条记录,Logical_read:111 vs 1170 vs 224
- 适当使用TEXT/BLOB类型
- data page默认16KB
- 每行长度超过8KB时,就需要分裂data page
- 产生更多离散I/O
- 案例:一个100G的表拆分成4个表后,总大小仅25G
- 每个表增加create_time、update_time两个字段
- 分别表示写入时间以及最后更新时间
- 业务上可能用不到,但是对日常运维管理则非常有用
- 可以用来判断哪些是可以归档的老数据,定期进行归档
- 用来做自定义的差异备份也很方便
- 索引很重要
- InnoDB行锁是基于索引实现
- 如果没有索引,将会是灾难性的
- 读取时,全表扫描
- 修改时,全表记录锁
- 索引设计
- 基数(cardinality)低的字段一般没必要建立单列索引
- 字符型字段上建索引时优先采用部分索引(prefix index)
- 5.6.9之后,optimizer能识别到普通索引同时存储主键值,无需显式定义加上主键列(Index Extensions)
- 优先多列联合索引(multi column index),少用单列索引
- 怎么算是好SQL
- 所有WHERE条件都加上引号
- 避免潜在的类型隐式转换风险
- 避免个别条件失效时SQL语法错误
- 不SELECT *
- 减少不必要的I/O
- 提高可以利用覆盖索引的几率
- 避免SQL注入风险
- 所有用户输入值都要做过滤
- 利用PREPARE做预处理
- 利用SQL_MODE做限制
- LIKE查询时,不要用%通配符最左前导(无法使用索引)
- 能UNION ALL就不要UNION(UNION需要去重,会产生临时表)
- SQL中最好不要有运算
- WHERE子句中,不要有函数
- 关于join
- 满足业务需求前提下尽量用inner join,让优化器自动选择驱动表
- 有时候优化器选择的驱动表未必是最优的,可以尝试手动调整
- 最后的排序字段如果不在驱动表中,则会有filesort
- eg:
- UPDATE t SET c2 = ? AND c3 = ? WHERE c1 = ‘?’ -> UPDATE t SET c2 = ? , c3 = ? WHERE c1 = ‘?’
- UPDATE t SET c2 = ?WHERE c1 = ‘?’ -> UPDATE t SET c2 = ? WHERE c1 = ‘?’
- SELECT * FROM t WHERE c1 = ‘?’ -> SELECT c2,c3 FROM t WHERE c1 = ‘?’
- SELECT c2,c3 FROM t WHERE c4 like ‘%???%’ -> SELECT c2,c3 FROM t WHERE c1 >= ? AND c1 <= ? AND c4 like ‘%???%’
- SELECT c2,c3 FROM t WHERE date(c1) = ‘2016-10-15’ -> SELECT c2,c3 FROM t WHERE c1 >= ‘2016-10-15’ AND c1 < ‘2016-10-16’
- SELECT c2,c3 FROM t WHERE char_col = int_value -> SELECT c2,c3 FROM t WHERE char_col = ’int_value’
- 关于EXPLAIN
- 关键业务SQL上线前,都要EXPLAIN确认其执行计划
- 或提前分析slow query log,防患未然
- EXPLAIN中如果有Using temporary、Using filesort、或type=ALL时,尽量想办法进行优化
- 存储引擎
- 抛弃MyISAM,InnoDB为王
- 适当的场景下可以采用TokuDB
- 误区:MEMORY可不见得就快
以上参照了2016杭州云栖大会分享
高效mysql的习惯(程序员版本)的更多相关文章
- [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-升级PHP到PHP7
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- DIY党的福利!鹅厂程序员教你200元以内制作专属分体键盘
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由VellHe发表于云+社区专栏 前言 作为一名程序员,键盘在手,天下我有啊,不整把高大上的键盘怎么提升B格.之前一直想买个机械键盘,听 ...
- <开心一笑> 码农 黑客和2B程序员之间的区别
笔记本电脑 码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L< ...
- [Linux] PHP程序员玩转Linux系列-nginx初学者引导
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
随机推荐
- [洛谷P1801]黑匣子_NOI导刊2010提高(06)
题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...
- bzoj 1878
莫队乱搞的第一题,(感觉这个算法初学的时候就能想到啊) 总之就是离线,然后扫一遍然后回答,用数组记录状态 但还是有一个地方不太明白 为什么要除siz?这样为什么会优化复杂度呢?? bool cmp(c ...
- 如何使用Photoshop制作真实的尺子
前言: 日常生活中经常性的偶尔需要测量一些东西的尺寸,但刚好手头上缺乏尺子等必要的测量工具,这时候其实我们可以利用Photoshop,临时制作一把基于现实物理单位(如:厘米)的虚拟尺子. 难点: 像素 ...
- POJ1182:食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 94930 Accepted: 28666 Description ...
- Google File System中文版
英文原文地址: Google File system 译文原文地址: The Google File System中文版 Google File System中文版 摘要 我们设计并实现了Google ...
- 关于IE6的一些总结
开篇之前,循例简单说说IE6的一些背景吧. IE6是指微软浏览器系列中的第六个版本,它是在2001年的时候伴随着XP系统的问世而同时推出的一款浏览器.因为XP普及的原因,这款浏览器一度问鼎全球浏览器市 ...
- Eclipse Jetty调试时无法保存js文件
Jetty会使用内存映射文件来缓存静态文件,包括js,css文件. 在Windows下,使用内存映射文件会导致文件被锁定,所以当Jetty启动的时候无法在编辑器对js或者css文件进行编辑. 解决办法 ...
- Restful 接口权限控制
前言 有人说,每个人都是平等的: 也有人说,人生来就是不平等的: 在人类社会中,并没有绝对的公平, 一件事,并不是所有人都能去做: 一样物,并不是所有人都能够拥有. 每个人都有自己的角色,每种角色都有 ...
- HDU 1877 又一版 A+B(进制转换)
看了http://lovnet.iteye.com/blog/1690276的答案 好巧妙的方法 递归实现十进制向m进制转换 #include "stdio.h" int m; v ...
- UOJ#80 二分图最大权匹配 [模板题]
从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...