資料庫除了資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。簡而言之,索引是幫助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\g2.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` ((4)刪除索引`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))
)
drop index index_name on table2.2 唯一索引
與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:
(1)建立唯一索引
create unique index indexname on table(column(length))(2)修改表結構
alter table table_name add unique indexname(column(length))(3)建立表的時候直接指定
create table `table` (2.3 主鍵索引`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))
);
是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引:
create table `table` (2.4 組合索引`id` int(11) not null auto_increment ,
`title` char(255) not null ,
primary key (`id`)
);
指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用組合索引時遵循最左字首集合
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` ((2)修改表結構新增全文索引`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)
);
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.選擇唯一性索引 唯一性索引的值是唯一的,可以快速通過...