高效的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的习惯(程序员版本)的更多相关文章

  1. [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  2. [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  3. [Linux] PHP程序员玩转Linux系列-升级PHP到PHP7

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  4. DIY党的福利!鹅厂程序员教你200元以内制作专属分体键盘

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由VellHe发表于云+社区专栏 前言 作为一名程序员,键盘在手,天下我有啊,不整把高大上的键盘怎么提升B格.之前一直想买个机械键盘,听 ...

  5. <开心一笑> 码农 黑客和2B程序员之间的区别

    笔记本电脑 码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L< ...

  6. [Linux] PHP程序员玩转Linux系列-nginx初学者引导

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  7. [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  8. [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  9. [Linux] PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

随机推荐

  1. 洛谷P4592 [TJOI2018]异或 【可持久化trie树】

    题目链接 BZOJ4592 题解 可持久化trie树裸题 写完就A了 #include<algorithm> #include<iostream> #include<cs ...

  2. big 解题报告

    big 题目描述 你需要在\([0,2^n)\)中选一个整数\(x\),接着把\(x\)依次异或\(m\)个整数\(a_1\sim a_m\). 在你选出\(x\)后,你的对手需要选择恰好一个时刻(刚 ...

  3. 【BZOJ 3772】精神污染 主席树+欧拉序

    这道题的内存…………………真·精神污染……….. 这道题的思路很明了,我们就是要找每一个路径包含了多少其他路径那么就是找,有多少路径的左右端点都在这条路径上,对于每一条路径,我们随便选定一个端点作为第 ...

  4. MySQL:BlackHole

    MySQL:BlackHole 顾名思义BlackHole就是黑洞,只有写入没有输出.现在就来实验一下吧 首先查看一下MySQL支持的存储引擎 mysql> show engines;+---- ...

  5. MySQL的字符集小结

    正确了解MySQL的字符集问题,能够从根本上解决乱码的困扰. 首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对 ...

  6. 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)

    P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...

  7. eclipse中的debug按钮组突然找不到了,找回方法

  8. 解决“并非来自 Chrome 网上应用店。”

    Chrome谷歌浏览器已停用不支持的扩展程序解决方法 第一种方法:(亲测有效) 1.首先把需要安装的第三方插件,后缀.crx 改成 .rar,然后解压,得到一个文件夹 2.再打开chrome://ex ...

  9. [06] JavaScript 类型

    下面对知识点总结: 1.类型分类 a.原始类型:number, string, boolean, null, undefined b.对象类型:除了原始类型都是(例如:object,array, fu ...

  10. 编写一个 Chrome 浏览器扩展程序

    浏览器扩展允许我们编写程序来实现对浏览器元素(书签.导航等)以及对网页元素的交互, 甚至从 web 服务器获取数据,以 Chrome 浏览器扩展为例,扩展文件包括: 一个manifest文件(主文件, ...