20171108
死鎖怎么處理(P10)
- (如果事務(wù)出現(xiàn)死鎖)大多數(shù)情況下只需要重新執(zhí)行因死鎖回滾的事務(wù)即可。
- 目前在代碼中通過try捕獲異常,如果異常為死鎖,則重新執(zhí)行該事務(wù)
InnoDB次級索引包含主鍵列(P17)
- InnoDB的次級索引(非主鍵索引)中必須包含主鍵列,所以如果主鍵列很大的話砾医,其他的所有索引都會很大。因此衣厘,表上索引較多的話如蚜,主鍵應(yīng)該盡可能的小。
- 所以影暴,一般表的主鍵盡量用自增的Id
- 非Id為主鍵的表错邦,確實(shí)性能比較差
Memory表與查詢極慢BLOB,TEXT(P21坤检,P118)
- 查詢中間結(jié)果超過Memory表的限制兴猩,或者包含BLOB或者TEXT字段,則會在硬盤中生成臨時(shí)表早歇,效率極低
- Memory引擎不支持BLOB和TEXT倾芝,所以只能使用磁盤臨時(shí)表
- 在查詢的時(shí)候,盡量使用SUBSTRING(column,length)箭跳,order by也適用晨另,但是截取長度要注意,臨時(shí)表大小不要超過tmp_table_size
- 也可以調(diào)整max_length_for_sort_data來排序BLOB和TEXT(還是需要磁盤臨時(shí)表)
- 我們有一個(gè)包含MEDIUMBLOB數(shù)據(jù)的表谱姓,有幾十萬行借尿,大小幾個(gè)G;對該表的部分查詢(count屉来,order路翻,group等),速度極慢茄靠;一個(gè)count要運(yùn)行幾分鐘
盡量避免使用NULL(P112)
- 對于InnoDB茂契,NULL是通過單獨(dú)的bit來存儲的,所以不成立
- 對于其他引擎慨绳,有索引的列盡量避免使用NULL
整數(shù)類型寬度(P113)
- 對于存儲和計(jì)算來說掉冶,INT(1)和INT(20)是相同的
CHAR和VARCHAR(P115)
- UTF-8字符集,盡量使用VARCHAR
- 存儲定長的值脐雪,適合用CHAR厌小,例如MD5碼
設(shè)計(jì)注意點(diǎn)(P117,P127)
- 盡量使用更短的列
- 避免太多的列
- 避免太多的關(guān)聯(lián)
- 混用范式和反范式(根據(jù)實(shí)際需要)