Mysql建立高效能索引
阿新 • • 發佈:2019-01-01
面試真題: 簡單描述Mysql中,索引,主鍵,唯一索引,聯合索引的區別,對資料庫的效能有什麼影響?
Mysql索引的基礎和型別
索引的基礎: 1.索引類似於書籍的目錄,要想找到一本書的某個特定主題,需要先查詢書的目錄,定位對應的頁碼
- 儲存引擎使用類似的方式進行資料查詢,先去索引當中找到對應的值,然後根據匹配的索引找到對應的資料行
索引對效能的影響
- 大大減少伺服器需要掃描的資料量,比如我們資料表中有一千條資料,我們只要根據條件查詢其中的一條,我們只需要根據這一列建立一個對應的索引就可以。
- 幫助伺服器避免排序和臨時表
- 將隨機I/O變順序I/O
- 大大提高查詢速度,降低寫的速度,佔用磁碟
索引的使用場景
- 對於非常小的表,大部分情況下全表掃描效率會更高。不用去刻意的建立索引
- 中到大型表,索引非常有效
- 特大型的表,建立和使用索引的代價將隨之增長,刻意使用分割槽技術來解決,
索引的型別
- 索引有很多種型別,都是事先在儲存引擎層的
- 普通索引:最基本的索引,沒有任何約束限制
- 唯一索引:與普通索引類似,但是具有唯一性,比如現在我們有了一個a 你在建立一個a 就會報錯了
- 主鍵索引:特殊的唯一索引,不允許有控制
- 一個表只能有一個主鍵索引,可以有多個唯一索引
- 主鍵索引一定是唯一索引,唯一索引不是主鍵索引
- 主鍵可以與外來鍵構成參照完整性約束,防止資料不一致
- 組合索引:將多個列組合在一起建立索引,可以覆蓋多個列
- 外來鍵索引:只有InnoDB型別的表才可以使用外來鍵索引,保證資料的一致性,完整性和實現級聯操作
- 全文索引:mysql自帶的全文索引只能用於MyISAM,並且只能對英文進行全文索引
Mysql索引的建立原則
原則:
- 最適合索引的列是出現在where子句中的列,或連線子句中的列而不是出現在select關鍵字後的列
- 索引列的基數越大,索引的效果越好
- 對字串進行索引,應該制定一個字首長度,可以節省大量的索引空間
- 根據情況建立複合索引,複合索引可以提高查詢效率
- 避免建立過多的索引,索引會額外佔用磁碟空間,降低寫操作的效率
- 主鍵儘可能選擇較短的資料型別,可以有效減少索引的自盤佔用,提高查詢效率
mysql索引的注意事項
注意
- 複合索引遵守字首原則
可以生效的
不可生效的是
因為這種屬於是最左字首型別的 所以 必須有前面的在前才能使用,否則會不可使用,使用b不能忽略a 使用c不能忽略b
- Like查詢,%不能在前,可以使用全文索引
百分號不能在前,要不然就算給name設定了索引,所以也無法生效。可以使用全文索引
- Column is null可以使用索引
- 如果mysql估計使用索引比全盤掃描更慢,會放棄使用索引
- 如果or前的條件中的列有索引,後面的沒有,索引都不會被用到
- 列型別是字串型別,查詢時一定要給值加引號,否則索引失效
比如varchar(16)
“100”
假如我在搜尋的時候 where name=100; 沒有去加引號的話 可以搜到 但是索引失效。
在一些mysql索引基礎考題中,我們可以輕鬆的通過索引基礎和型別來解決此類問題,對於一些索引建立注意事項方面的考點,我們可以通過索引建立的原則和注意事項來解決。
真題: 建立mysql複合索引應該注意哪些事項?