MySQL高階 二 索引簡介

2021-09-23 05:43:46 字數 3923 閱讀 1358

資料庫除了資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。簡而言之,索引是幫助mysql高效獲取資料的資料結構,是「排好序的快速查詢資料結構」。 

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。我們平常所說的索引,如果沒有特別指明,都是b樹(多路搜尋樹,並不一定是二叉樹)結構組織的索引。其中,聚集索引、復合索引、字首索引、唯一索引預設都是使用b+樹索引,統稱索引。當然,除了b+樹這種型別的索引之外,還有雜湊索引(hash index)、全文索引(full-text)、r-tree索引。 

優勢

➤ 類似於大學圖書館建書目索引,提高資料檢索的效率,降低資料庫的io成本 

➤ 通過索引列對資料進行排序,降低資料排序的成本,降低了cpu的消耗

劣勢

➤ 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert、update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案每次更新新增了索引列的字段,都會調整因為更新所帶來的鍵值變化後的索引資訊。 

➤ 索引只是提高效率的乙個因素,如果你的mysql有大資料量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句

基本語法:

create [unique] index indexname on mytable(columnname(length));

alter mytable add [unique] index [indexname](columnname(length))

drop index [indexname] on mytable;

show index from table_name\g

2.1 普通索引

是最基本的索引,它沒有任何限制。它有以下幾種建立方式: 

(1)直接建立索引

create index index_name on table(column(length))

(2)修改表結構的方式新增索引

alter table table_name add index index_name(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

2.2 唯一索引

與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式: 

(1)建立唯一索引

create unique index indexname on table(column(length))

(2)修改表結構

alter table table_name add unique indexname(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 ,

unique indexname (title(length))

);

2.3 主鍵索引

是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引:

create table `table` (

`id` int(11) not null auto_increment ,

`title` char(255) not null ,

primary key (`id`)

);

2.4 組合索引

指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用組合索引時遵循最左字首集合

alter table `table` add index name_city_age (name,city,age); 

2.5 全文索引

主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是乙個搜尋引擎,而不是簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。值得一提的是,在資料量較大時候,現將資料放入乙個沒有全域性索引的表中,然後再用create index建立fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。 

(1)建立表的適合新增全文索引

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`),

fulltext (content)

);

(2)修改表結構新增全文索引

alter table article add fulltext index_content(content)

(3)直接建立索引

create fulltext index index_content on article(content)

3. 需要建立索引的情況

主鍵自動建立唯一索引

頻繁作為查詢條件的字段應該建立索引

查詢中與其它表關聯的字段,外來鍵關係建立索引

頻繁更新的字段不適合建立索引(因為每次更新都需要更新索引)

where條件裡用不到的字段不建立索引

單鍵/組合索引的選擇問題(在高併發下傾向建立組合索引)

查詢中排序的字段,排序欄位若通過索引去訪問將大大提高排序速度

查詢中統計或者分組字段

4. 不要建立索引的情況

表記錄太少

經常增刪改的表

資料重複且分布平均的表字段,因此應該只為最經常查詢和最經常排序的資料列建立索引(如***)

MySQL高階學習記錄 17 索引簡介

效能下降sql變慢,執行時間長 等待時間長,原因以及優化方法 1 資料過多 分庫分表 2 關聯了太多的表,太多join sql優化 3 沒有充分利用到索引 索引建立 優化效果最好 4 伺服器調優及各個引數設定 調整my.cnf 索引是什麼?索引是資料結構,幫助mysql高效獲取資料的資料結構。排好序...

mysql高階索引 Mysql高階 索引優化全解

是否會使用索引,是mysql的關鍵 1.sql效能下降原因查詢語句寫的不好,連線子查詢太多,沒有建索引等等 索引失效 關聯jion表過多 伺服器引數設定不合適2.索引優化 索引是什麼?索引就是一種排好序的查詢資料結構,常見模型有雜湊表 有序陣列 二叉搜尋樹 目前最常用的innodb引擎使用的模型是b...

mysql 索引簡介

索引 是一種特殊的資料結構,可以用來快速查詢資料庫表中的特定記錄.是提高資料庫效能的重要方式.包括普通索引,唯一性索引,全文索引,單列索引,多列索引和空間索引.簡介 由資料庫表中的一列或多列組合而成,起作用是提高對錶中資料的查詢速度.設計原則 1.選擇唯一性索引 唯一性索引的值是唯一的,可以快速通過...