MySQL数据库索引教程(超详细)

索引初步

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引分单列索引、唯一索引、组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引;唯一索引,即索引列的值必须唯一,但允许有空值。 创建主键的时候回自动创建唯一索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

缺点

虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

索引结构

在这里插入图片描述


实验准备(以下实验都在VMware中进行)

1台MySQL主机(5.7)

准备写一个2千万左右的数据表(当然不是手写)

创建索引:Navicat 15 for MySQL (图形化工具)


1、新建一个数据库

create database test default character set utf8; 

2、新建一个数据表

CREATE TABLE testsql (
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '自增主键',
    dept tinyint not null comment '部门id',
    name varchar(30) comment '用户名称',
    create_time datetime not null comment '注册时间',
    last_login_time datetime comment '最后登录时间' 
) comment '测试表';

3、写入数据

insert into testsql values(1,1,'user_1', '2018-01-01 00:00:00', '2018-03-01 12:00:00');

4、赋值

set @i=1;

5、做一个表的倍数增加(不然几千万的数据写一年都写不完)

insert into testsql(dept, name, create_time, last_login_time) 
select left(rand()*10,1) as dept,   #随机生成1~10的整数
        concat('user_',@i:=@i+1),   #按序列生成不同的name
        date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), #生成有时间大顺序随机注册时间
        date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND) #生成有时间大顺序的随机的最后登录时间
from testsql;

一直重复运行上面的命令

到后面的速度会越来越慢,可能要几分钟,这是正常的

6、查看

select count(*) from testsql;

这行命令可以查看数据表已经达到了多少列

直到数字出现了几千万行就可以停止了

(实几百万行已经可以看到效果了)

查看日志

show variables like "%_buffer%";

7、实验

这个时候数据表已经达到了几千万
可以查询以下几千万数据中的某一行

select COUNT(*) from t where name='user_500000';

可以看到搜索速度很慢

8、创建索引

选中数据表,单机右键
选中数据表,单击右键
找到索引
名字可以随便取
字段我选择的是name(其他也可以)
选择索引,名字随便取,字段我选的是name
类型我选的是NORMAL,方法用的是BTREE
类型我选的是NORMAL,方法用的是BTREE
保存,可能要等几分钟,这时候不要乱动
保存,可能要等几分钟,这时候不要乱动

9、实验效果

这个时候重新搜索,可以看到延迟已经没有了

select COUNT(*) from t where name='user_500000';

以上就是MySQL数据库索引的教程

  • 12
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值