mysql存儲時間有兩種類型:datetime和timestamp。分别說一下兩者的差別。
datetime,以8位元組存儲時間,理論上可以從0000年存儲到9999年。并且沒有時區的概念,它存儲的就是一個時間點的概念。
timestamp和datetime最主要的不同就是,它是以4個位元組存儲,由1970年開始,計算到目前的秒數,理論上的最大值是2038年。好處就是存儲的空間更少,還有一個主要的差別是:timestamp跟系統的時區相關。
ENUM和SET,枚舉和集合。枚舉表示一個定義的集合中的任一個值,集合表示一個定義的集合中的一個或多個值。差別在于ENUM并不會同時出現兩種情況,SET會。需要特别說明的是,不要濫用ENUM,在定義的集合較大時,并不适合适應枚舉。還有就是如果,定義的集合為{true,false}時,可以直接使用bool值。
标示符,标示列會用于和其他列進行比較。可以用作其他表的外鍵,一般會選擇跟關聯表對應列相同的資料類型。一旦選擇好了标示符,就要確定關聯表的其他資料都使用相同的類型,混用标示符會造成不可預知的後果,就算表面上沒有問題,但是隐式操作時也可能會造成性能問題。一般建議使用整數作為标示符,原因是因為消耗小,速度快,并且支援AUTO-INCREMENT。
接下來說一下mysql的資料表設計,其實沒必要完全遵循所謂的規則,對于實際應用場景應該從實際出發。範式和反範式各自有他們的優缺點。
範式表,一般較小,資料重複度比較低。更少使用distinct和group by。是以操作單個表速度更快。
缺點就是因為表結構太簡單,如果需要複雜資料就不可避免的要關聯。關聯查詢是個比較痛苦的點。
再介紹一個資料表設計的陷阱:就是不要有太多的列。和行緩存有關系,說是伺服器層和存儲引擎通過行緩存copy資料,然後伺服器将行緩存資料解析成列,過多的列對系統的消耗極大。這裡的過多是指幾百上千列。
還有,避免過多的關聯,最多不可以超過61個關聯。
寫的比較淩亂,因為就是想到什麼寫什麼,等這一章,看完,會結合這幾期讀書比較,完整的梳理一遍,寫一則章節總結。