阅读更多
尽量不用NULL列
query cache:读写比例决定
innodb索引一定要在后面加上主键列
参数配置
inno_lock_table:
导致死锁的重现方式
自增长:innodb_autoinc_lock_mode=2插入性能最高
AUTO-INC locking完成插入后立即释放,不等事务结束
分类:
insert-like:所有insert
insert/replace [select],load data等
simple-inserts: 最简单insert
insert/replace
bulk inserts:不确定行数
insert/replace select,load data
mixed-mode inserts:一部分自增长,一部分确定
insert values (value1),(valueN);
方式控制innodb_autoinc_lock_mode
0:表锁.5.1.22之前
1:默认值。
simple-inserts:互斥量
bulk inserts:传统表锁autoinc locking
如果不回滚,仍是连续的。
并且sql复制是安全的
mixed-mode inserts:一部分自增长,一部分确定
2:采用互斥量
优点:性能最高
缺点:自增值不连续
基于sql的复制,主从不一致
myisam、innodb实现方式不同,myisam作为innodb从,需要注意这个问题
myisam:表锁,没有并发插入问题
group
行数过多
按规则拆为多表,进行group,再做sum
联合索引(a,b,c),a范围查询,group by b
如果数量不多,可以拆为多个等值group,再进行聚合
结果集过大导致临时表放不下
tmp_table_size、max_heap_table_size两个中较小者
set @@session.tmp_table_size=xxx;
# SQL 规范
http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html
-- sql_mode
ONLY_FULL_GROUP_BY
不要启用:NO_UNSIGNED_SUBTRACTION:两个整数运算的结果为有符号型
从全局表获取一个ID
delete t from tb as t
,(select (@mid:=id) as id from tb order by id limit 1) as t2
where t.id=t2.id;
select @mid;
MYSQL升级时
innodb_fast_shutdown必须设为0
完成所有的undo页回收(full purge),insert buffer合并,flush dirty page
优化经验
http://cocos.iteye.com/blog/1041894