一、 测试索引

一 准备

数据库准备:

#1. 准备表

create table s1(

id int,

name varchar(20),

gender char(6),

email varchar(50)

);

#2. 创建存储过程,实现批量插入记录

delimiter $$ #声明存储过程的结束符号为$$

create procedure auto_insert1()

BEGIN

declare i int default 1;

while(i<3000000)do

insert into s1 values(i,'eva','female',concat('eva',i,'@oldboy'));

set i=i+1;

end while;

END$$ #$$结束

delimiter ; #重新声明分号为结束符号

#3. 查看存储过程

show create procedure auto_insert1\G

#4. 调用存储过程

call auto_insert1();

二 在没有索引的前提下测试查询速度

#无索引:mysql根本就不知道到底是否存在id等于333333333的记录,只能把数据表从头到尾扫描一遍,此时有多少个磁盘块就需要进行多少IO操作,所以查询速度很慢

mysql> select * from s1 where id=333333333;

Empty set (0.33 sec)

三 在表中已经存在大量数据的前提下,为某个字段段建立索引,建立速度会很慢

mysql数据库层面数据校验 mysql数据库测试_mysql数据库层面数据校验

四 在索引建立完毕后,以该字段为查询条件时,查询速度提升明显

mysql数据库层面数据校验 mysql数据库测试_mysql_02

PS:

1. mysql先去索引表里根据b+树的搜索原理很快搜索到id等于333333333的记录不存在,IO大大降低,因而速度明显提升

2. 我们可以去mysql的data目录下找到该表,可以看到占用的硬盘空间多了

3. 需要注意,如下图

mysql数据库层面数据校验 mysql数据库测试_主键_03

五 总结

#1. 一定是为搜索条件的字段创建索引,比如select * from s1 where id = 333;就需要为id加上索引

#2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,建完后查询速度加快

比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。

建完以后,再查询就会很快了。

#3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI

MySAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按照B+Tree(BTree即Balance True)组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引。

因为inndob的数据文件要按照主键聚集,所以innodb要求表必须要有主键(Myisam可以没有),如果没有显式定义,则mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则mysql会自动为innodb表生成一个隐含字段作为主键,这字段的长度为6个字节,类型为长整型