什麼是索引
?我們可以這麼理解,索引
就好比是一本書的目錄,拿一本你不瞭解的書給你,讓你找某一個知識點最快的方式就是先查找目錄,定位頁數然後直接翻到具體頁數。
使用索引的好處
- 避免了檢索數據時磁盤的 全表掃描,可以節省掃描時間,可以節省記錄排隊進入內存的和CPU的時間
- 對於多表連接和嵌套查詢更加有利;select * from stu_info where id in(select s_id from marks_info where marks>60)
- 對特定的索引列找出MAX()或MIN()值。
使用索引的缺點
- 索引文件佔用磁盤空間
- 如果建立的索引過多,那麼掃描,索引目錄文件浪費時間過多;
- 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE,MySQL不僅要保存數據,還要保存一下索引文件。
查看索引
-
desc tbname;
Key字段: MUL普通 pri主鍵 uni唯一
show index from 表名;//查看錶的索引
explain 分析sql的索引使用情況
Mysql中主要有4類索引
- 主鍵索引(primary key)
- 唯一索引(unique)
- 常規索引(index)
- 全文索引(fulltext)
根據記錄的特點
普通索引:index(常規索引)
-
表中的任何字段都可以建立普通索引(記錄可以爲null,記錄可以重複)
Create index 索引名 on 表名(字段名)
常規索引技術是關係型數據查詢中最重要的技術,如果要提升數據庫的性能,索引優化是首先應該考慮的,因爲他能使我們的數據庫得到最大性能方面的提升。如果沒有索引的數據表,就沒有排序的數據集合,要查詢數據就需要進行全表掃描。有索引的表是一個在索引列上排序了的數據表,所以可通過索引快速定位記錄。
在Myisam數據表中數據行保存在數據文件中,索引保存在索引文件中。但是在Innodb數據表中,數據與索引放在同一個文件中。
常規索引也存在缺點,例如,佔用磁盤空間,而且還會減慢在索引數據列上的插入、刪除、修改操作,他們也需要按照索引列上的排序格式執行。
因此索引應該創建在搜索、排序、分組等操作所涉及的數據列上。也就是在where子句,多表查詢中的from子句、order by 或 group by 子句中出現過的數據列最合適用來創建這種索引。但是不要建太多索引,索引會消耗資源。
-
-
主鍵索引: 記錄不能爲空,記錄不能重複
主鍵索引是關係型數據庫中最常見的索引類型,主要作用是確定數據表中的一條特定的數據的位置。數據表會根據主鍵的唯一性來唯一標識每條記錄,這樣可以加快尋址定位的速度,最好每張表都指定一個主鍵
create table 表名(id int(5) primary key;
create table test (
Id int(5) not null auto_increment,
Name varchar(4) not null,
Primary key(id)
);
唯一索引:unique index
唯一索引的記錄可以爲空[null],但是記錄不能重複,與主鍵的不同之處在於每個數據表中只能有一個主鍵索引,但是可以有多個唯一索引,如果能確定某個數據列將只包含彼此各不相同的值,在爲這個數據列創建索引時,就應該使用 unique 把它定義爲一個唯一索引
在有新紀錄插入的時候,就會自動檢測新紀錄的這個字段值,是否已經在某個現有的記錄的這個字段裏出現過了,如果是,Mysql 將拒絕插入這條記錄
-
其實創建唯一索引的目的往往不是爲了提高訪問速度,而只是爲了避免數據重複。
Create unique index 索引名 on 表名(字段名)
根據索引的個數
單列索引,以上講的都是單列
多列索引
就是索引內容爲多個字段,建立一個多列索引就相當於建立多個單列索引,建立兩個字段的多列索引就相當於建立了三個索引,在創建索引的時候,儘量創建多列索引。
-
多列普通索引
create index 索引名 on 表(字段1,字段2)
-
多列唯一索引
create unique index 索引名 on 表(字段1,字段2)
-
多列主鍵索引(複合主鍵)
錯誤 :
create table news( id int(2) auto_increment primary key, name varchar(20) primary key, );
正確:
create table 表名( 字段1, 字段2, ... primary key(字段1,字段2……) );
根據內容索引
根據字段的value長度進行建立索引
-
短索引:
建立短索引的字段特點: 字符型varchar或者文本型text的字段,字段的內容前半部分出現重複的情況比較少;
如:河南信陽男子小學門口砍殺24人獲死刑,日韓改變態度允許民航向中國通報飛行計劃,駐歐盟使團發言人:“法輪功”是反華政治組織,灣強制大陸資本21日內撤出有線電視領域,彭麗媛撰文懷念恩師感謝提攜之情 稱其爲伯樂
title varchar(120)
create index 索引名 on 表(字段(20))
create index title on news(title(20))
-
單列普通短索引
create index 名 on 表(字段1(長度))
-
單列唯一短索引
create unique index 名 on 表(字段1(長度))
-
單列主鍵短索引
create table aa(
id int(11) ,
...
primary key(id(3)
)
-
多列普通短索引
create index 名 on 表(字段1(長度),字段2(長度))
-
多列唯一短索引
create unique index 名 on 表(字段1(長度),字段2(長度))
-
多列主鍵短索引
create table news_info (
id int (2),
title varchar(100),
author varchar(50),
content varchar(500),
primary key(title(20),author(10))
);
全文索引 fulltext index
如果查詢的字段的部分內容在該內容中出現率>50%或者表中記錄<2條的時候,全文索引沒用
-
50% 全文索引也沒用
Create fulltext index 索引名稱 on tbname(column);
innodb引擎中沒用
-
MYSQL 默認不開啓 全文索引
修改mysql配置文件:window服務器爲my.ini,linux服務器爲my.cnf,
在 [mysqld] 後面加入一行“ft_min_word_len=1”,然後重啓Mysql。
-
全文索引的使用: 不區分大小寫
Select xxx from tbname WHERE MATCH (索引字段) AGAINST (‘關鍵字’);
REPAIR TABLE table_name; 重新加載表內存
Sphinx,dede
刪除索引
drop index 索引名 on 表名
索引沒有名稱怎麼刪除?
ALTER TABLE table_name DROP PRIMARY KEY
建立索引注意要點
檢索速度:主鍵-->唯一-->普通--->沒有索引
索引內容匹配的長度: 能建立短索引儘量的建立短索引
儘量建立多列索引(但是多列索引不能過多)
建立的索引(字段)必須是在where後經常頻繁出現的字段
- 表的主鍵、外鍵必須有索引(主鍵默認有索引,外鍵是表與表之間聯繫的字段)
- 數據量超過300條記錄的表應該有索引
- 經常與其他表進行連接的表,在連接字段上應該建立索引(外鍵)
- 經常出現在Where子句中的字段,特別是大表的字段,應該建立索引
- 索引應該建在選擇性高的字段上
- 對於大的文本字段甚至超長字段應該建立全文索引