李琪的技术专栏 System Research

MySql基础复习(3)---索引

2020-05-18
Clear Li

阅读:


索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 也就是二分查找与普通查找的速度差异。

查看索引

show index form <表名>

image-20200518121254594

可以看到索引是主键索引而且是使用的b树的结构

主键索引

主键索引是一种唯一性索引,使用时必须指定PRIMARY KEY。

测试

下面一张表是有几万数据的一个表,并且是没有设置主键的。

image-20200518115734057

那么查找一个数据耗时0.215秒

image-20200518115827994

然后我们将empno设置为主键

image-20200518120001857

再来查询一下,会发现查询时间只有0.01秒了

image-20200518120023276

普通索引

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

测试用例

创建表

-- 普通索引
create table ccc(
id int unsigned,
name varchar(32)
)

创建索引

-- 创建普通索引
create index testIndex on ccc (id,name);

查询索引

image-20200518122341444

唯一索引

唯一索引和主键索引很类似,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。有如下创建方法。而且唯一索引还可以为空

创建索引

create unique index <索引的名字> on tablename(列的名字)

修改表

alter table tablename add unique [索引的名字](列的列表)

加上索引后再来查看一下索引

image-20200519181509508

上图中的画横线的就是唯一索引

全文索引

主要使用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;


表的内容如下

image-20200519191114685

然后不用索引的查询为

select * from articles where body like '%mysql%'; 

正确用法:

select * from articles where match(title,body) against ( 'database')

说明:

  1. 在mysql中fulltext 索引只针对 myisam生效

  2. mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文

  3. 使用方法是 match(字段名..) against(‘关键字’)

  4. 全文索引:停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.比如(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)否则,会创建一个隐藏键作为聚集索引

普通索引 定位的是主键值,也就是说普通索引的查询必须查询两次,第一次查询主键第二次查询行


Similar Posts