规范、经验

阅读更多
尽量不用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

你可能感兴趣的:(MySQL)