20171108
死锁怎么处理(P10)
- (如果事务出现死锁)大多数情况下只需要重新执行因死锁回滚的事务即可。
- 目前在代码中通过try捕获异常,如果异常为死锁,则重新执行该事务
InnoDB次级索引包含主键列(P17)
- InnoDB的次级索引(非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。因此,表上索引较多的话,主键应该尽可能的小。
- 所以,一般表的主键尽量用自增的Id
- 非Id为主键的表,确实性能比较差
Memory表与查询极慢BLOB,TEXT(P21,P118)
- 查询中间结果超过Memory表的限制,或者包含BLOB或者TEXT字段,则会在硬盘中生成临时表,效率极低
- Memory引擎不支持BLOB和TEXT,所以只能使用磁盘临时表
- 在查询的时候,尽量使用SUBSTRING(column,length),order by也适用,但是截取长度要注意,临时表大小不要超过tmp_table_size
- 也可以调整max_length_for_sort_data来排序BLOB和TEXT(还是需要磁盘临时表)
- 我们有一个包含MEDIUMBLOB数据的表,有几十万行,大小几个G;对该表的部分查询(count,order,group等),速度极慢;一个count要运行几分钟
尽量避免使用NULL(P112)
- 对于InnoDB,NULL是通过单独的bit来存储的,所以不成立
- 对于其他引擎,有索引的列尽量避免使用NULL
整数类型宽度(P113)
- 对于存储和计算来说,INT(1)和INT(20)是相同的
CHAR和VARCHAR(P115)
- UTF-8字符集,尽量使用VARCHAR
- 存储定长的值,适合用CHAR,例如MD5码
设计注意点(P117,P127)
- 尽量使用更短的列
- 避免太多的列
- 避免太多的关联
- 混用范式和反范式(根据实际需要)