DDL执行
- 在线上服务器执行DDL,更新表的结构,这个操作需要谨慎处理
- DDL结构更改,会导致全表被独占锁定,此时表处于维护状态,不可修改。如果是innodb还好些,因为5.6支持online DDL效果显著缩短锁定时间
- 采用的维护表的DDL,是copy策略:
- 例:增加一个列,一个索引:并不是直接执行alter table
- 思路:
- 创建一个新表,满足新的结构
- 将旧表数据导入新表中(读操作)逐条导入,保证一次性写入的内容很少,同时表上可执行其他任务
- 导入的过程中,记录表上的新更新操作,以日志的形式记录
- 导入完毕后,将更新日志在新表重做一遍
- 新表替换旧表即可:在应用程序中完成,或数据库的rename或视图完成
数据导入语句
恢复数据时,往往需要大量的数据导入,一些快速导入技巧:
对于innodb事务存储引擎,可将多条sql放在一个事务中完成
innodb是按主键排序的,如果导入数据本身就是按主键渐排序,那么导入速度相对较快
可以使用prepare预编译的方案执行导入操作,减少相同结构的sql编译次数
大页码 limit offset 和limit
在使用limit时尽量不要使用大的offset
例如:limit 100000.,10
思路:尽量使用条件过滤,完成数据筛选,而不是通过offset跳过已经查到的数据
select * 少用
尽量选择自己需要的字段,不过性能提升感知不强,因为mysql服务器最耗时的是检索,该操作减少的是数据传输的时间
order by rand()不要用
逻辑是:随机排序
单表对多表查询
尽量使用单表查询代替多表查询
原因:
- 计算压力分布:单表查询计算压力在程序端,多表查询计算压力在数据库上
- 多表查询的执行如join子查询,也是一个一个表的去执行,执行完再去合并结果
- 多表查询会增加表的锁定时间,降低并发性
- 单表查询会增加程序复杂度,不过orm模型已经做了大部分的工作
count (*)问题
对于myisam没有问题,他会在表中自动存储数据总量
对于innodb没有这个内部计数器,如果统计是一个常规工作,则需要自己来完成该统计
count(id)统计id不为null的数量
limit 1
如果确定检索一条,建议加上limit 1
大部分框架的查询单条操作,都会自动加上