索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 也就是二分查找与普通查找的速度差异。
查看索引
show index form <表名>
可以看到索引是主键索引而且是使用的b树的结构
主键索引
主键索引是一种唯一性索引,使用时必须指定PRIMARY KEY。
测试
下面一张表是有几万数据的一个表,并且是没有设置主键的。
那么查找一个数据耗时0.215秒
然后我们将empno设置为主键
再来查询一下,会发现查询时间只有0.01秒了
普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
测试用例
创建表
-- 普通索引
create table ccc(
id int unsigned,
name varchar(32)
)
创建索引
-- 创建普通索引
create index testIndex on ccc (id,name);
查询索引
唯一索引
唯一索引和主键索引很类似,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。有如下创建方法。而且唯一索引还可以为空
创建索引
create unique index <索引的名字> on tablename(列的名字)
修改表
alter table tablename add unique [索引的名字](列的列表)
加上索引后再来查看一下索引
上图中的画横线的就是唯一索引
全文索引
主要使用fulltext关键字,主要针对文章的内容创建。
下面创建一个表
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
)engine=myisam charset utf8;
表的内容如下
然后不用索引的查询为
select * from articles where body like '%mysql%';
正确用法:
select * from articles where match(title,body) against ( 'database')
说明:
-
在mysql中fulltext 索引只针对 myisam生效
-
mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
-
使用方法是 match(字段名..) against(‘关键字’)
-
全文索引:停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.比如(a,b,mysql,the)
联合索引注意事项
1一定要和第一部分的索引一起使用。
如 索引alter table dept add index my_ind (dname,loc);
必须使用dname或者dname和loc一起使用才可以使用索引。
2可以使用like关键字但是不能加%
3参数值上一定要加上单引号
分割线—————————————————————————-
2020-5-28
innodb的索引
聚集索引:定位的是行记录,。Innodb必须要有聚集索引且只有一个聚集索引,
(1)如果表定义了PK,则PK就是聚集索引
(2)如果表没有定义pK,那么第一个not NULL 且Unique 就是聚集索引
(3)否则,会创建一个隐藏键作为聚集索引
普通索引 定位的是主键值,也就是说普通索引的查询必须查询两次,第一次查询主键第二次查询行