**1\. 為什么要盡量設定一個主鍵?**
主鍵是數據庫確保數據行在整張表唯一性的保障,即使業務上本張表沒有主鍵,也建議添加一個自增長的ID列作為主鍵.設定了主鍵之后,在后續的刪改查的時候可能更加快速以及確保操作數據范圍安全.
*****
**2\. 主鍵使用自增ID還是UUID?**
推薦使用自增ID,不要使用UUID.
因為在InnoDB存儲引擎中,主鍵索引是作為聚簇索引存在的,也就是說,主鍵索引的B+樹葉子節點上存儲了主鍵索引以及全部的數據(按照順序),如果主鍵索引是自增ID,那么只需要不斷向后排列即可,如果是UUID,由于到來的ID與原來的大小不確定,會造成非常多的數據插入,數據移動,然后導致產生很多的內存碎片,進而造成插入性能的下降.
總之,在數據量大一些的情況下,用自增主鍵性能會好一些.
*****
**3\. 字段為什么要求定義為not null?**
NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.
null值會占用更多的字節,且會在程序中造成很多與預期不符的情況
**4\. 如果要存儲用戶的密碼散列,應該使用什么字段進行存儲?**
密碼散列,鹽,用戶身份證號等固定長度的字符串應該使用char而不是varchar來存儲,這樣可以節省空間且提高檢索效率(char和varchar的區別請自行了解).
*****
**5\. MySQL支持哪些存儲引擎?**
MySQL支持多種存儲引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多數的情況下,直接選擇使用InnoDB引擎都是最合適的,InnoDB也是MySQL的默認存儲引擎.
InnoDB和MyISAM有什么區別?
* InnoDB支持事物,而MyISAM不支持事物
* InnoDB支持行級鎖,而MyISAM支持表級鎖
* InnoDB支持MVCC, 而MyISAM不支持
* InnoDB支持外鍵,而MyISAM不支持
* InnoDB不支持全文索引,而MyISAM支持。
*****
**6\.MySQL中的varchar和char有什么區別.**
char是一個定長字段,假如申請了char(10)的空間,那么無論實際存儲多少內容.該字段都占用10個字符,而varchar是變長的,也就是說申請的只是最大長度,占用的空間為實際字符長度+1,最后一個字符存儲使用了多長的空間.
在檢索效率上來講,char > varchar,因此在使用中,如果確定某個字段的值的長度,可以使用char,否則應該盡量使用varchar.例如存儲用戶MD5加密后的密碼,則應該使用char.
*****
**7\. varchar(10)和int(10)代表什么含義?**
varchar的10代表了申請的空間長度,也是可以存儲的數據的最大長度,而int的10只是代表了展示的長度,不足10位以0填充.也就是說,int(1)和int(10)所能存儲的數字大小以及占用的空間都是相同的,只是在展示時按照長度展示.
**8.\說一說三大范式**
第一范式: 每個列都不可以再拆分.
第二范式: 非主鍵列完全依賴于主鍵,而不能是依賴于主鍵的一部分.
第三范式: 非主鍵列只依賴于主鍵,不依賴于其他非主鍵.
在設計數據庫結構的時候,要盡量遵守三范式,如果不遵守,必須有足夠的理由.比如性能. 事實上我們經常會為了性能而妥協數據庫的設計.
反三也就是適當的做數據冗余,空間換時間