首頁 > 軟體

MySQL資料庫索引原理及優化策略

2023-11-22 14:01:24

1 索引

索引概念

索引是一種特殊的檔案,包含著對資料表裡所有記錄的參照指標。可以對錶中的一列或多列建立索引,並指定索引的型別,各類索引有各自的資料結構實現。

索引作用

資料庫中的表、資料、索引之間的關係,類似於書架上的圖書、書籍內容和書籍目錄的關係,索引所起的作用類似書籍目錄,可用於快速定位、檢索資料。索引可以極大地提高資料庫的效能。

索引的使用場景

要考慮對資料庫表的某列或某幾列建立索引,需要考慮以下幾點:

  • 資料量較大,且經常對這些列進行條件查詢。
  • 該資料庫表的插入操作,及對這些列的修改操作頻率較低。
  • 索引會佔用額外的磁碟空間。

2 索引分類

  • 從索引儲存結構劃分:BTree索引、Hash索引、FULLTEXT全文索引、RTree索引
  • 從應用層次劃分:普通索引,唯一索引,主鍵索引,複合索引
  • 從索引鍵值型別劃分,主鍵索引,輔助索引(二級索引)
  • 從資料儲存和索引鍵值邏輯關係劃分:聚集索引(聚簇索引)非聚集泰引(非聚簇索)
  • 從索引列數量劃分:單列索引,複合索引

B樹索引和B+樹索引區別

區別:

資料的儲存位置不同:B+樹儲存在葉子節點,B樹儲存在所有的節點中

體現出B+樹優勢:節點不儲存data,這樣一個節點就可以儲存更多的key。可以使得樹更矮,所以IO操作次數更少。 查詢效能穩定:每次查詢都是從根節點遍歷到葉子節點,查詢路徑長度相同,即每次查詢效率相當,時間複雜度固定是O(log(n))

葉子節點的指向:B+樹相鄰的葉子節點通過指標相連,B樹沒有

體現出B+樹優勢:所有葉子節點形成有序連結串列,便於範圍查詢

3 索引操作

建立主鍵索引

-- 在建立表的時候,直接在欄位名後指定 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 goodsG
*********** 1. row ***********
Table: goods <= 表名
Non_unique: 0 <= 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資料庫索引原理及優化策略的文章就介紹到這了,更多相關MySQL資料庫索引內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com