索引是一種特殊的文件,包含對資料表裡所有記錄的引用指標。可以對錶中的一列或多列建立索引,並指定索引的類型,各類索引有各自的資料結構實作。
資料庫中的表格、資料、索引之間的關係,類似書架上的圖書、書籍內容和書籍目錄的關係,索引所扮演的角色類似書籍目錄,可用於快速定位、檢索資料。索引可以大大提高資料庫的效能。
要考慮對資料庫表的某一列或某幾列建立索引,需要考慮以下幾點:
數據量較大,且經常對這些列進行條件查詢。
此資料庫表的插入操作,及這些資料列的修改操作頻率較低。
索引會佔用額外的磁碟空間。
從索引儲存結構分割:BTree索引、Hash索引、FULLTEXT全文索引、RTree索引
#從應用層級劃分:普通索引,唯一索引,主鍵索引,複合索引
從索引鍵值類型劃分,主鍵索引,輔助索引(二級索引)
從資料儲存和索引鍵值邏輯關係劃分:聚集索引(叢集索引)非聚集泰引(非叢集索)
從索引列數量劃分:單列索引,複合索引
區別:
資料的保存位置不同:B 樹保存在葉子節點,B樹保存在所有的節點中
體現B 樹優勢:節點不儲存data,這樣一個節點就可以儲存更多的key。可以使得樹更矮,所以IO操作次數更少。查詢效能穩定:每次查詢都是從根節點遍歷到葉子節點,查詢路徑長度相同,即每次查詢效率相當,時間複雜度固定是O(log(n))
葉子節點的指向:B 樹相鄰的葉子節點透過指標相連,B樹沒有
體現B 樹優勢:所有葉子節點形成有序鍊錶,便於範圍查找
-- 在创建表的时候,直接在字段名后指定 primary key create table user1(id int primary key, name varchar(30)); -- 在创建表的最后,指定某列或某几列为主键索引 create table user2(id int, name varchar(30), primary key(id)); -- 创建表以后再添加主键 create table user3(id int, name varchar(30)); alter table user3 add primary key(id);
主鍵索引的特點:
#一個表中,最多有一個主鍵索引,當然可以讓符合主鍵
#主鍵索引的效率高(主鍵不可重複)
#建立主鍵索引的列,它的值不能為null,且不能重複
主鍵索引的欄位基本上是int
-- 在表定义时,在某列后直接指定unique唯一属性。 create table user4(id int primary key, name varchar(30) unique); -- 创建表时,在表的后面指定某列或某几列为unique create table user5(id int primary key, name varchar(30), unique(name)); -- 创建表以后再添加unique create table user6(id int primary key, name varchar(30)); alter table user6 add unique(name);
唯一索引的特點:
一個表中,可以有多個唯一索引
查詢效率高
如果在某一列建立唯一索引,必須保證這列不能有重複資料
如果一個唯一索引上指定not null,等價於主鍵索引
--在表的定义最后,指定某列为索引 create table user8(id int primary key, name varchar(20), email varchar(30), index(name) ); --创建完表以后指定某列为普通索引 create table user9(id int primary key, name varchar(20), email varchar(30)); alter table user9 add index(name); -- 创建一个索引名为 idx_name 的索引 create table user10(id int primary key, name varchar(20), email varchar(30)); create index idx_name on user10(name);
普通索引的特點:
一個表中可以有多個普通索引,普通索引在實際開發中用的比較多
如果某一列需要建立索引,但是該列有重複的值,那麼我們就應該使用普通索引
#show keys from 表名
mysql> show keys from goods\G
*********** 1. row * **********
Table: goods Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1
Column_name: goods_id Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE Comment:
1 row in set (0.00 sec)
show index from 表名;
#desc 表名
#刪除主鍵索引: alter table 資料表名稱drop primary key;
#其他索引的刪除: alter table 表名drop index 索引名稱;索引名稱是show keys from 表名中的Key_name 欄位
mysql> alter table user10 drop index idx_name;
drop index 索引名on 表名
mysql> drop index name on user8
比較頻繁作為查詢條件的欄位應該建立索引
唯一性太差的欄位不適合單獨建立索引,即使頻繁地作為查詢條件
更新非常頻繁的欄位不適合作建立索引
不會出現在where子句中的欄位不該建立索引
以上是MySQL資料庫索引原理及最佳化策略是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!