什麼是索引?
索引是數據表中一個或多個列進行排序的數據結構
爲什麼需要索引? 因爲索引能夠大幅提升檢索速度
Mysql 使用的索引結構是B-Tree
常見查找結構以及優缺點:
線性查找:一個個的找;實現簡單;太慢
二分查找:有序,簡單,要求是有序的,插入特別慢
HASH:查詢快;佔用空間;不太適合存儲大規模數據
二叉查找樹:插入和查找快,無法存大規模數據,複雜度退化
平衡樹(只有兩個節點):解決二叉樹退化的問題,樹是平衡的。節點非常多的適合,樹高會很高。
多路查找樹:一個父親多個孩子節點(度);節點過多樹高不會特別深
多路平衡查找樹:B-Tree
索引對性能的影響:
- 大大減少對服務器需要掃描的數據量
- 幫助服務器避免排序和臨時表
- 將隨機IO變成順序IO
- 大大提高查詢速度,降低寫的速度,佔用磁盤
索引的使用場景:
對於非常小的表沒有必要建立索引
中到大型表,索引很有效
特大型的表,建立和使用索引的代價將隨之增長
索引的類型
- 普通索引
CREATE INDEX indexName ON mytable(username(length));
- 唯一索引(一個表可以有多個)
CREATE UNIQUE INDEX indexName ON mytable(username(length))
- 主鍵索引(不可以有空值,一個表只能有一個)
- 聯合索引(將多個列組合在一起創建索引,可以覆蓋多個列)組合索引就是複合索引
- 外鍵索引
- 全文索引 FULLTEXT
索引的創建原則:
1:最適合索引的列是出現在where子句中的列,或連接子句中的列而不是出現在select關鍵字後的列,經常用作表連接的字段,經常出現在order by、 groupby之後的字段
2:索引的基數越大,索引的效果越好
3:對字符串進行索引,應該制定一個前綴長度,可以節省大量的索引空間
4:根據情況創建符合索引
5:避免創建過多的索引,索引會額外佔用磁盤空間,降低寫操作效率
6:主鍵儘可能的選擇較短的數據類型,可以有效減少索引的磁盤佔用提高查詢效率
7:儘量使用費控字段,mysql很難對空值進行查詢優化
8:區分度高,離散度大,作爲索引的字段值儘量不要有大量相同值
注意:
以下情況索引會失效!!! :簡單講就是 模糊匹配 類型轉換 最左匹配
1:複合索引遵循前綴原則
2:like查詢,%不能在前,可以使用全文索引。
3:column is null 可以使用索引
4:如果mysql估計使用索引會比全表索引比全表掃描更慢,會放棄使用索引。
5:如果or 前的條件中的列有索引,後面的沒有,索引都不會被用到
6:列類型是字符串,查詢時一定要給值加引號,否則索引會失效
普通索引是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
(1)直接創建索引
CREATE INDEX index_name ON table(column(length))
(2)修改表結構的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
(3)創建表的時候同時創建索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
(4)刪除索引
DROP INDEX index_name ON table
延申:
什麼是聚集索引和非聚集索引?
聚集還是非聚集指的是B+Tree葉節點存的是指針(數據地址)還是數據記錄, 指針就是聚集索引,數據記錄就是非聚集索引
MyISAM 索引和數據分離,使用的是非聚集索引
InnoDB數據文件就是索引文件,主鍵索引就是聚集索引
聚集索引可參考這篇文章,講的很棒 https://www.cnblogs.com/s-b-b/p/8334593.html