《高性能MySQL》读书摘录之一

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)

  • 尽量使用更短的列
  • 避免太多的列
  • 避免太多的关联
  • 混用范式和反范式(根据实际需要)

你可能感兴趣的:(《高性能MySQL》读书摘录之一)