真題
簡單描述MySQL中,索引、主鍵缰揪、唯一索引陨享、聯(lián)合索引的區(qū)別,對數(shù)據(jù)庫的性能有什么影響钝腺?
MySQL索引的基礎(chǔ)和類型
索引:類似于書籍的目錄抛姑,想找到一本書的某個特定的主題,需要先找到書的目錄艳狐,定位對應(yīng)的頁碼定硝。
MySQL中存儲引擎使用類似的方式進行查詢,先去索引中查找對應(yīng)的值毫目,然后根據(jù)匹配的索引找到對應(yīng)的數(shù)據(jù)行蔬啡。
索引對性能的影響:
- 大大減少服務(wù)器需要掃描的數(shù)據(jù)量。
- 幫助服務(wù)器避免排序和臨時表镀虐。
- 將隨機I/O變順序I/O箱蟆。
- 大大提高查詢速度,降低寫的速度刮便、占用磁盤空猜。
索引的使用場景:
- 對非常小的表,大部分情況下全表掃描效率更高恨旱。
- 對中大型表辈毯,索引非常有效
- 特大型的表,建立和使用索引的代價隨著增長搜贤,可以使用分區(qū)技術(shù)來解決谆沃。
索引的類型
索引都是實現(xiàn)在存儲引擎層的。
- 普通索引:最基本的索引仪芒,沒有任何約束
- 唯一索引:與普通索引類似管毙,但具有唯一性約束
- 主鍵索引:特殊的唯一索引腿椎,不允許有空值
- 組合索引:將多個列組合在一起創(chuàng)建索引,可以覆蓋多個列
- 外鍵索引:只有InnoDB類型的表才可以使用外鍵索引夭咬,保證數(shù)據(jù)的一致性啃炸、完整性和實現(xiàn)級聯(lián)操作
- 全文索引:MySQL自帶的全文索引只能用于MyISAM,并且只能對英文進行全文檢索卓舵,一般使用全文索引引擎
主鍵索引和唯一索引的去別:
- 一個表只能有一個主鍵索引南用,可以有多個唯一索引
- 主鍵索引一定是唯一索引,唯一索引不是主鍵索引
- 主鍵和外鍵構(gòu)成參照完整性約束掏湾,防止數(shù)據(jù)不一致
延伸:MySQL索引的創(chuàng)建原則
- 最適合索引的列是出現(xiàn)在
where
子句中的列裹虫,或連接子句中的列,而不是出現(xiàn)在select
關(guān)鍵字后的列融击; - 索引列的基數(shù)越大筑公,索引效果越好;
- 對字符串進行索引尊浪,應(yīng)該定制一個前綴長度匣屡,可以節(jié)省大量的索引空間;
- 根據(jù)情況創(chuàng)建復(fù)合索引拇涤,復(fù)合索引可以提高查詢效率捣作;
- 避免創(chuàng)建過多的索引,索引會額外占用磁盤空間鹅士,降低寫操作效率券躁;
- 主鍵盡可能選擇較短的數(shù)據(jù)類型,可以有效減少索引的磁盤占用提高查詢效率
延伸:MySQL索引的注意事項
- 復(fù)合索引遵循前綴原則掉盅;
- like查詢也拜,%不能在前,可以使用全文索引趾痘;
-
column is null
可以使用索引搪泳; - 如果MySQL估計使用索引比全表掃描更慢,會放棄使用索引扼脐;
- 列類型是字符串類型岸军,查詢時一定要給值加引號,否則索引失效瓦侮。