- PHP 也有 Day 番外篇 Ant
RDBMS 資料庫案例設計 - 錢麟的墨冊
時間欄位
通常有國際標準的就直接 Follow, e.g. ISO
, RFC
, Schema.org
其實沒有絕對的標準,通常搭配業務需求來決定,也非僅有一組最佳答案
password_hash("password", PASSWORD_BCRYPT)
固定產生長度為 60 的字串原則上看 where 後面用到什麼,搭配 explain 指令來查看 sql 語法吃到的 index 是哪個
SELECT * FROM users WHERE ( `email`={email} OR `username`={username} ) AND `password`={password} AND `password_expired_at` > NOW() AND `status` = {active};
where 後面主要有 email
OR username
AND password
AND password_expired_at
接著
[email]
, [username]
idx_email, idx_username
[email]
, [username]
, [password]
idx_email
–– 清除所有 index ––
[username, email]
[email, username]
(idx_email_username, idx_username_email)
SELECT id, email, status FROM users WHERE `email` = {email} AND `token` = {token} AND `token_expired_at` > NOW() AND `status` = {unverified}
[email]
通常我們可以把資料儲存分成 Index 跟 data,這兩塊是分地儲存的
撈資料的流程,通常是從 index 查找看是否滿足。如果所要欄位在 index 裡面沒有,就要額外到 data 區查找來回傳。
但是如果要撈出來的資料在 index 裡面就涵蓋了,就不需要去 data 區撈資料了。這種取得方式稱為Covering Index
也可以說是最快速的 Index.
利用 innodb_space, page_illustrate 來分析 char, varchar 之間的更新變換
由於 char 的資料結構原本就是固定長度
record
儲存位置不變
page
中的位置會產生碎片,因為原先就預留 char 的大小位置在發生更新資料長度不同的時候
與初始資料 「一樣長」,
record
儲存位置不變page
儲存結構圖沒變,因為空間還是夠塞比初始資料 「短」,
record
儲存位置不變page
儲存結構圖沒變,因為空間還是夠塞比初始資料 「長」,
record
儲存位置改變,因為原先位置放不下page
儲存結構圖舊的位置產生碎片,新的資料存放到大小允許的空間通常碎片發生在 update
跟 delete
的時候
副作用
解決碎片浪費空間的方法
Lock Table
!!!若欄位業務很常要 update 但不想要產生碎片,就用 char 吧!!
Question: 為何不 nullable?
@ 當然如果有業務需求也可以使用
以上為聽 Ant 口語跟 Demo 操作時的個人筆記,建議大家都可以試著自己操作分析加深印象