一、主鍵索引和唯一索引的區別
(1)主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
(2)主鍵創建后一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。
(3)唯一性索引列允許空值,而主鍵列不允許為空值。
(4)主鍵可以被其他表引用為外鍵,而唯一索引不能。
(5)一個表最多只能創建一個主鍵,但可以創建多個唯一索引。
(6)主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
(7)在RBO模式下,主鍵的執行計划優先級要高於唯一索引。 兩者可以提高查詢的速度。
約束主要有:主鍵約束、外鍵約束、非空約束、檢查約束(bentwen and ,大於、小於、等於、不等於)、唯一約束。
二、索引失效的幾種情況
1、索引並不總是都會生效的,比如以下幾種情況,將導致索引失效,從而走全表掃描:
(1)如果條件中有or,即使其中有部分條件帶索引也不會使用(這也是為什么盡量少用or的原因),如果要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引;
(2)對於復合索引,如果不使用前列,后續列也將無法使用索引,復合索引需要滿足最左匹配原則;
(3)模糊查詢like以%開頭;
(4)索引列的數據存在數據類型隱形轉換,則用不上索引,比如列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引;
(5)where子句里對索引列上有數學運算,用不上索引;
(6)where 子句里對有索引列使用函數,用不上索引;
(7)如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
2、什么情況下不推薦使用索引
(1)數據唯一性差(一個字段的取值只有幾種時,例如性別字段)的字段不要使用索引;
(2)頻繁更新的字段不要使用索引;
(3)字段不在where語句出現時不要添加索引,如果where后含IS NULL 、IS NOT NULL、 like ‘%輸入符%’等條件,不建議使用索引;
(4)where 子句里對索引列使用不等於(<>),使用索引效果一般。
參考博文:
(1)https://www.cnblogs.com/-619569179/p/6528896.html
(2)https://www.cnblogs.com/liehen2046/p/11052666.html
(3)https://blog.csdn.net/guoxingege/article/details/51034387