mysql中不可不做的事情

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

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主键推荐使用自增列

主键建立聚簇索引
主键不应该被修改
字符串不应该做主键
如果不指定主键,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)

时间: 2024-11-07 20:02:08

mysql中不可不做的事情的相关文章

Mekefile中所做的事情

1:经过之前的分析我们知道Makefile主要做的事情有: (1):首先配置makefile make x210_sd_config 配置时实际上执行的是:./mkconfig xd_210 arm s5pc11x x210 samsung s5pc110 ./mkconfig 为一个shell脚本: xd_210 arm s5pc11x x210 samsung s5pc110为6个参数传入mkconfig脚本中: 在把"TEXT_BASE = 0xc3e00000" 写入board

10 件在 PHP 7 中不要做的事情

1. 不要使用mysql_函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数,或者更灵活的 PDO 实现. 2. 不要编写垃圾代码 这一条可能易于理解,但是会变得越来越重要,因为 PHP 7 的速度提升可能会隐藏你的一些问题.不要仅仅满足于你的站点速度,因为迁移到 PHP 7 才让它变快. 为了理解速度有多重要,以及如何把事情做得更好,请看一看我们的文章速度优化入门指南. 作为一名开发者,你应

10件在PHP7中不要做的事情

1. 不要使用mysql_函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数,或者更灵活的 PDO 实现. 2. 不要编写垃圾代码 这一条可能易于理解,但是会变得越来越重要,因为 PHP 7 的速度提升可能会隐藏你的一些问题.不要仅仅满足于你的站点速度,因为迁移到 PHP 7 才让它变快. 为了理解速度有多重要,以及如何把事情做得更好,请看一看我们的文章速度优化入门指南. 作为一名开发者,你应

《领导梯队》:4星。企业中六个层级的领导的必知必会和必须不能做的事情。

书不错,根据许多企业的情况总结出来的,作者们有企业家的顾问经验. 总体内容是每一次晋级都是思路的转换,每一层领导都需要转换思路才能做好,每一层领导都容易犯的错误是事必躬亲. 作者列出六个层级的领导:经理.总监.事业部副总经理.事业部总经理.集团高管.CEO,并且给出每一个层级具体需要做的事情.不应该做的事情. 书中的6个层级基本上应该是在超大型公司中才能看到的.不过作者也说了,重要的是思路而不是生搬硬套. 小缺陷是英文版成书于2000年,到现在近20年了,像<基业长青>一样,书中举出的好公司比

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有点拗口,实际上要想让一个迭代器工作,至少要实现__iter__方法和next方法.很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用.优雅.pythonic.下边是一个例子,从里边你会感受到不用列表而用迭代器的原因. #!/usr/bin/env python #c

MySQL中索引和优化的用法总结

1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的默认存储引擎,InnoDB有两种索引:B+树索引和哈希索引,其中哈希索引是自适应性的,存储引擎会根据表的使用情况,自动创建哈希索引,不能人为的干涉. B树.B-树.B+树.B*树四种数据结构在索引中的运用,这四种数据结构的顺序必须是这样的.分别阐述如下: B树:二叉树,每个结点只存储一个关键字,等于

Mysql中Key与Index的区别

mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括primary key, unique key, foreign key 等. primary key 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key上建立了一个index: unique key 也有两个作用,一是约束作用(cons

Mysql中错误日志、binlog日志、查询日志、慢查询日志简单介绍

前言 数据库的日志是帮助数据库管理员,追踪分析数据库以前发生的各种事件的有力根据.mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决下面问题:各个日志的作用是什么?如何去控制这些日志呢?如何去使用这些日志提供的信息呢? 错误日志 1.错误日志作用 错误日志记录了mysql启动和停止时.以及server执行过程中发生不论什么严重性错误的相关信息.当数据库出现不论什么故障导致无法启动时候.比方mysql启动异常.我们可首先检查此日志.在mysql中,错

MySQL 中Redo与Binlog顺序一致性问题 【转】

首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下MySQL主从复制过程中的一些细节问题,有关于主从复制可以看具体的章节. 在了解了以上基础的内容后,我们可以带着以下的几个问题去学习复制到底是怎样工作的. 为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺