mysql索引筆記

MYSQL索引

1、索引的優缺點

優勢:
 
1.經過建立惟一索引,能夠保證數據庫表中每一行的惟一性。
2.能夠大大加快查詢速度,這是建立索引的最主要緣由
3.在實現數據參考完整性方面,能夠加速表和表之間的連接
4.在使用分組和排序子句進行數據查詢時,也能夠顯著減小查詢中分組和查詢的時間

缺點:

1.建立索引和維護索引要耗費時間,而且隨着數據量的增長所耗費的時間也會增長。
2.索引須要佔磁盤空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。
3.當對錶中的數據進行增長、刪除和修改的時候,索引也要動態地維護,這樣就下降了數據的維護速度。

2、索引的分類

1.普通索引和惟一索引

普通索引是MYSQL中的基本索引類型,容許在定義索引的列中插入重複值和空值。
惟一索引,索引列的值必須惟一,但容許有空值,若是是組合索引,則列值的組合必須惟一。主鍵索引是一種特殊的惟一索引,不容許有空值

2.單列索引和組合索引

單列索引即一個索引只包含一個列,一個表能夠有多個單列索引
組合索引指在表的多個字段組合上建立的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,組合索引遵循最左原則

3.全文索引

全文索引類型爲fulltext,在定義索引的列上支持值得全文查找,容許在這些索引列中插入重複值和空值。全文索引能夠在char、varchar和text類型的列上建立。MYSQL中只有MyISAM支持全文索引

4.空間索引

空間索引是對空間數據類型的字段創建的索引,mysql中的空間數據類型有4種,分別是:GEOMETRY、POINT、LINESTRING和POLYGON.mysql中使用spatial關鍵字進行擴展,使得可以用於建立正規索引相似的語法建立空間索引。建立空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在MyISAM中建立

3、索引的設計原則

1.索引並不是越多越好,一個表中若有大量的索引,不只佔用磁盤空間,並且會影響INSERT、DELETE、UPDATE等語句的性能,由於當表中的數據更改的同時,索引也會進行調整和新。
2.避免對常常更新的表進行過多的索引,而且索引中的列儘量少。而對常常用於查詢的字段應該建立索引,但要避免添加沒必要要的字段。
3.數據量小的表最好不要使用索引,因爲數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
4.在條件表達式中常常用到的不一樣值較多的列上創建索引,在不一樣值不多的列上不要創建索引。好比在學生表的「性別」字段上只有「男」與「女」兩個不一樣值,所以就無須創建索引。若是創建索引不但不會提升查詢效率,反而會嚴重下降數據更新速度。
5.當惟-性是某種數據自己的特徵時,指定惟一索引。使用惟一索引需能確保定義的列的數據完整性,以提升查詢速度。
6.在頻繁進行排序或分組( 即進行group by或order by操做)的列上創建索引,若是待排序的列有多個,能夠在這些列上創建組合索引。

4、建立索引,建立索引分爲三種方法

1.建立表時指定索引

  create table book (
            id int primary key auto_increment,  #主鍵自增
            name varchar(255) not null unique,  #惟一索引
            author varchar(255) not null,
            info varchar(255),
            comment varchar(255),
            year int(11) ,
            index (year)  #普通索引
        );
 
能夠定義字段的時候定義索引,也能夠在最後給指定列定義索引
 
eg:
惟一索引:unique index index_name(col) 
組合索引 : index index_name(col,col1,col2)
全文索引:fulltext index fullTxtIdx(col)------只有MyISAM支持
空間索引:spatial index spaIdx(col)————只有MyISAM支持 
 
組合索引遵循最左原則:利用索引中最左邊的列集來匹配行。這樣的列集成爲最左前綴

2.修改表時添加索引

語法: ALTER TABLE table_name add [ unique | fulltext | spatial] [index | key ] [index_name] (col(length),... )[ ASC | DESC]
 
3.爲存在的表添加索引
create [unique | fulltext | spatial] index index_name on table_name (col(length))[ASC | DESC]
eg: ALTER TABLE `dev_djbisai`.`dj_game_contest_user` ADD UNIQUE INDEX `a`(`status`, `create_time`) USING BTREE COMMENT 'aaaa';
 
5、刪除索引
1.使用ALTER TABLE 刪除索引
    ALTER TABLE table_name DROP INDEX index_name;
相關文章
相關標籤/搜索