MySQL的索引類型及簡單優化

普通索引:index,單字段/多字段,可存在多個,列值or組合列值無限制
mysql

惟一索引:unique index,單字段/多字段,可存在多個,列值or組合列值不可重複,但能夠爲NULL的重複,由於NULL值的記錄不會被添加到索引.....sql

主鍵索引:primary key,單字段/多字段,惟一性,列值or組合列值不可重複優化

組合索引:當普通/惟一/主鍵爲多字段時,即爲追尋左前綴匹配的組合索引,其餘限制根據各自特性自行理解spa

InnoDB要5.6以上纔可支持
code

全文索引:fulltext index,單字段/多字段,可存在多個,列值or組合列值無限制,但列屬性必須爲char,varchar,text類型,查詢使用 where match(column_name) against('keywords')orm


普通索引

添加索引索引

CREATE INDEX index_name ON tableName(`column_name`);
//可限定索引列長:`username` varchar(25)可設定索引長度爲indexName(`username`(10));
CREATE INDEX index_name ON tableName(`column_name`(10));

添加索引rem

ALTER TABLE tableName ADD INDEX indexName(`column_name`);
//可限定索引列長:`username` varchar(25)可設定索引長度爲indexName(`username`(10));
ALTER TABLE tableName ADD INDEX indexName(`column_name`(10));

刪除索引字符串

DROP INDEX indexName ON tableName;
ALTER TABLE tableName DROP INDEX indexName;
惟一索引 

做爲此索引的列不容許有重複的列值it

注意:單字段則字段值不可重複,空字符串也不能夠,但能夠爲NULL

          多字段組合模式則組合的值不可重複,但能夠爲NULL的組合

CREATE UNIQUE INDEX indexName ON tableName(`column_name`);
//可限定索引列長:`username` varchar(25)可設定索引長度爲indexName(`username`(10));
CREATE UNIQUE INDEX indexName ON tableName(`column_name`(10));
ALTER UNIQUE TABLE tableName ADD INDEX indexName(`column_name`);
//可限定索引列長:`username` varchar(25)可設定索引長度爲indexName(`username`(10));
ALTER UNIQUE TABLE tableName ADD INDEX indexName(`column_name`(10));

刪除索引

DROP INDEX indexName ON tableName;
ALTER TABLE tableName DROP INDEX indexName;
主鍵索引

主鍵索引具備惟一性(注意,此惟一性是說整個表的primary key只能存在一個,但primary key 能夠爲多字段型),其餘的普通索引 惟一索引 組合索引能夠存在多個相同類型的索引

注意:單列值或組合列值不可重複,且不能夠爲NULL

ALTER TABLE tableName ADD PRIMARY KEY('column_name');
//多字段主鍵索引
ALTER TABLE tableName ADD PRIMARY KEY('column_name_1', 'column_name_2');

刪除主鍵索引時要確保此鍵不爲自增類型(auto_increment)

ALTER TABLE tableName DROP PRIMARY KEY;

組合索引 

組合索引爲多個字段共同創建,追尋做左前綴模式:

indexName(name, sex, age)

可使用

where name = 'name' 

where name = 'name' and sex = 'f' 

where name = 'name' and sex = 'f' and age >= 25

不可使用

where sex = 'f'

where age >= 25

where sex = 'f' and age >= 25

最左前綴模式 like操做僅在 like 'xxxx%'模式下有效,'_xxx%', '%xxxx%'無效

CREATE INDEX index_name ON tableName(`column_name_1`, `column_name_2`, `column_name_3`);
//可限定索引列長:`username` varchar(25)可設定索引長度爲index_name(`username`(10));
CREATE INDEX index_name ON tableName(`column_name_1`(10), `column_name_2`, `column_name_3`);
ALTER TABLE tableName ADD INDEX indexName(`column_name_1`, `column_name_2`, `column_name_3);
//可限定索引列長:`username` varchar(25)可設定索引長度爲index_name(`username`(10));
ALTER TABLE tableName ADD INDEX indexName(`column_name_1`(10), `column_name_2`, `column_name_3);
DROP INDEX index_name ON tableName;
ALTER TABLE tableName DROP INDEX indexName;


全文索引 

全文索引適用於MyISAM引擎,且只能爲char varchar text類型的列添加 查詢時使用where match(`column name`) against("keywords" in boolean mode)

添加索引

CREATE FULLTEXT INDEX indexName ON tableName(`columnName`[(length)]);
ALTER TABLE tableName ADD FULLTEXT INDEX indexName(`columnName`[(length)]);

全文索引 like查詢沒法使用

select `id` from tableName where match(`content`) against("keywords" in boolean mode);

刪除索引

DROP INDEX indexName ON tableName;
ALTER TABLE tableName DROP INDEX indexName;

索引優化

一、索引支持 < <= = => > between in 不支持 not in <>【索引是有序的,對於範圍類的查詢有效,對於非範圍的只能遍歷整張表,not in <>不到最後一條記錄是沒辦法確認查詢是否完成】

二、索引不會包含有NULL值的列

三、使用like操做時只有在第一位不爲通配符時索引纔會啓動

四、使用短索引,varchar(50)則視狀況而定取前幾位便可

五、不要在列值上計算,where year(addtime) < 2015 優化爲 where addtime < 2015-01-01

可使用explain命令來查看mysql是如何執行sql語句的,看本身的某些索引是否起了做用

相關文章
相關標籤/搜索