原文链接:https://segmentfault.com/a/1190000004711147

写在前面的话:
总是在灾难发生后,才想起容灾的重要性;
总是在吃过亏后,才记得曾经有人提醒过。

(一)核心军规
  (1)不在数据库做运算:cpu计算务必移至业务层
  (2)控制单表数据量:单表记录控制在1000w
  (3)控制列数量:字段数控制在20以内
  (4)平衡范式与冗余:为提高效率牺牲范式设计,冗余数据
  (5)拒绝3B:拒绝大sql,大事物,大批量

(二)字段类军规
  (6)用好数值类型
    tinyint(1Byte)
    smallint(2Byte)
    mediumint(3Byte)
    int(4Byte)
    bigint(8Byte)
    bad case:int(1)/int(11)
  (7)字符转化为数字
    用int而不是char(15)存储ip
  (8)优先使用enum或set
    例如:sex enum (‘F’, ‘M’)
  (9)避免使用NULL字段
    NULL字段很难查询优化
    NULL字段的索引需要额外空间
    NULL字段的复合索引无效
    bad case:
      name char(32) default null
      age int not null
    good case:
      age int not null default 0
  (10)少用text/blob
    varchar的性能会比text高很多
    实在避免不了blob,请拆表
  (11)不在数据库里存图片:是否需要解释?

(三)索引类军规
  (12)谨慎合理使用索引
    改善查询、减慢更新
    索引一定不是越多越好(能不加就不加,要加的一定得加)
    覆盖记录条数过多不适合建索引,例如“性别”
  (13)字符字段必须建前缀索引
  (14)不在索引做列运算
    bad case:
      select id where age +1 = 10;
  (15)innodb主键推荐使用自增列(SK:博主不认可)
    主键建立聚簇索引
    主键不应该被修改
    字符串不应该做主键
    如果不指定主键,innodb会使用唯一且非空值索引代替
  (16)不用外键
    请由程序保证约束

(四)sql类军规
  (17)sql语句尽可能简单
    一条sql只能在一个cpu运算
    大语句拆小语句,减少锁时间
    一条大sql可以堵死整个库
  (18)简单的事务
    事务时间尽可能短
    bad case:
      上传图片事务
  (19)避免使用trig/func
    触发器、函数不用
    客户端程序取而代之
  (20)不用select *
    消耗cpu,io,内存,带宽
    这种程序不具有扩展性
  (21)OR改写为IN()
    or的效率是n级别
    in的消息时log(n)级别
    in的个数建议控制在200以内
    select id from t where phone=’159′ or phone=’136′;
      =>
    select id from t where phone in (’159′, ’136′);
  (22)OR改写为UNION
    mysql的索引合并很弱智
    select id from t where phone = ’159′ or name = ‘john’;
    =>
    select id from t where phone=’159′
      union
    select id from t where name=’jonh’
   (23)避免负向%
  (24)慎用count(*)
  (25)同上
  (26)limit高效分页
    limit越大,效率越低
    select id from t limit 10000, 10;
      =>
    select id from t where id > 10000 limit 10;
  (27)使用union all替代union
    union有去重开销
  (28)少用连接join
  (29)使用group by
    分组
    自动排序
  (30)请使用同类型比较
  (31)使用load data导数据
    load data比insert快约20倍;
  (32)打散批量更新
  (33)性能分析工具
    show profile;
    mysqlsla;
    mysqldumpslow;
    explain;
    show slow log;
    show processlist;
    show query_response_time(percona)

【转】赶集网mysql开发36军规的更多相关文章

  1. 赶集网mysql开发36军规

    赶集网mysql开发36军规 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算:cpu计算务必移至业务层 (2)控 ...

  2. 【MySql】赶集网mysql开发36条军规

    [MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux   写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒 ...

  3. [赶集网] 【MySql】赶集网mysql开发36条军规

    [赶集网] [MySql]赶集网mysql开发36条军规 (一)核心军规(1)不在数据库做运算   cpu计算务必移至业务层:(2)控制单表数据量   int型不超过1000w,含char则不超过50 ...

  4. 赶集网mysql开发36条军规

    写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算    cpu计算务必移至业务层: (2)控制单表数据量    i ...

  5. MySQL开发36条军规

    转载地址:http://blog.itpub.net/22664653/viewspace-723506/ 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过 ...

  6. 慕课网--mysql开发技巧一 学习笔记

    现在存在下面的两张表,表的结构如下所示 师徒四人表结构:id,user_name,over数据:id user_name over1 唐僧 旃檀功德佛2 猪八戒 净坛使者3 孙悟空 斗战胜佛4 沙僧 ...

  7. 手机网游开发指南 - 需要多NB的技术

    Agent`K 似乎在三天打鱼N天晒网.只能呵呵了,懒散的家伙. 移动互联网越来越火,其中的网络游戏更是火,熊熊大火. 作为攻城师的你,作为小投资者的你,作为满脑子创意想要实现的你,肯定在四处打听:手 ...

  8. express框架+jade+bootstrap+mysql开发用户注册登录项目

    完整的项目代码(github):https://github.com/suqinhui/express-demo express是基于Node.js平台的web应用开发框架,用express框架开发w ...

  9. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

随机推荐

  1. linux vi编辑器操作手册

    简介 Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配.注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Windows 下的 word 有排版功 ...

  2. Linux软件安装-RPM安装

    RPM是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.         S ...

  3. [转]ASP.NET MVC IOC 之AutoFac攻略

    本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...

  4. Spring学习之第一个hello world程序

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  5. R语言学习笔记(一)

    1.不同的行业对数据集(即表格)的行和列称谓不同,统计学家称其为观测(observation)和变量(variable): 2.R语言存储数据的结构: ①向量:类似于C语言里的一位数组,执行组合功能的 ...

  6. 升级Flash Builder 4.6中的Flash Player版本

    测试有效 本人按此方法升级到了flash player 15 Adobe自发布Flash Builder 4.6后,就暂停了Flash Builder新版本的发布.但AIR和FlashPlayer版本 ...

  7. Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley

    在前面的几篇文章中,我们学习了如何用Volley去网络加载JSON数据,如何利用ImageRequest和NetworkImageView去网络加载数据,而关于Volley的使用,我们都是从下面一行代 ...

  8. 为什么mysql设置了密码之后,本地还可以直接访问,不需要输入密码就可以登录数据库了?

    应为数据库里面有空用户 select * from mysql.user where user=''; 查询如果有,把他删了然后重启mysql服务. 他有空用户你删除了 然后重启mysql生效,这个是 ...

  9. php base64 原理

    #include <stdio.h> #include <stdlib.h> #include <string.h> static const char base6 ...

  10. mysql游标循环的使用

    CREATE PROCEDURE `test`.`new_procedure` () BEGIN DECLARE done INT DEFAULT FALSE; -- 需要定义接收游标数据的变量 ); ...