MySQL索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
1、索引分类
- 索引分单列索引和组合索引:
- 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引
- 组合索引,即一个索引包含多个列
2、索引的体现
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)
3、索引利弊
使用索引有很多的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT
、UPDATE
和DELETE
。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
4、普通索引
这是最基本的索引,它没有任何限制
创建方式:
1)直接创建
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
CREATE INDEX indexName ON mytable(username(length));
2)修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
3)创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
删除索引:
DROP INDEX [indexName] ON mytable;
ALTER TABLE testalter_tbl DROP INDEX [indexName];
5、唯一索引(UNIQUE)
唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
创建方式:
1)直接创建
CREATE UNIQUE INDEX indexName ON mytable(username(length))
2)修改表结构
ALTER table mytable ADD UNIQUE [indexName] (username(length))
3)创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
6、全文本索引—— FULLTEXT(仅MyISAM支持)
创建方式:
1)创建表时创建
create table t1(name varchar(10), hobby text,fulltext(hobby));
2)直接创建
create fulltext name1 on t1(hobby)
使用全文本索引
match
指定查询的列,against
指定查询列中要查的值
select * from t1 where match(hobby) against('play the piano');
布尔文本索引
IN BOOLEAN MODE
布尔文本索引是全文本索引的一种
select note_text from t1 where matche(note_text) against('heavy -ref*' IN BOOLEAN MODE'); // 包含heavy,不包含refxxx
select note_text from t1 where matche(note_text) against('heavy ref' IN BOOLEAN MODE'); // 包含heavy或ref
select note_text from t1 where matche(note_text) against('"heavy ref"' IN BOOLEAN MODE'); // 包含heavy ref句子
注意:以下情况不走索引查询
-
条件中使用
in
,如name建立索引,select name from t1 where name in ('tom','john','jack');
-
索引列使用
like
,如:name建立索引,select name from t1 where name like '%om';
-
查询条件为
or
,部分条件未建索引,如:只有name建立索引,select * from t1 where name='tom' or age = 18;
。要么条件中的所有字段都建立索引,要么使用union进行组合查询
-
索引列使用函数,如:name建立索引,
select * from t1 where name=concat(name,'-',age);
-
索引列使用正则,如name建立索引,
select name from t1 where name regexp '[a-z]om';
-
字符串列与数字直接比较,如name建立索引,varchar类型数据,
select name from t1 where name=1;
-
where name is null
-
not in,单列索引a ,where a not in (xxxxx) ,不管里面是一个还是多个参数都用不到a的索引
技术web: