
MySQL学习之《索引使用》
发布日期:2021-05-15 01:24:10
浏览次数:22
分类:精选文章
本文共 2476 字,大约阅读时间需要 8 分钟。
MySQL索引
前言
这一章学习的是MySQL关于索引方面的知识,索引定义如下:
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。
提取句子主干,就可以得到索引的本质:索引是数据结构
1、索引的分类
-
主键索引(primary key)
- 唯一的标识,主键不可重复,只能有一个列作为主键
-
唯一索引(unique key)
- 避免重复的列出现,唯一索引可以重复,多个列可以标识
-
常规索引(key/index)
- 默认的,index/key 关键字来设置
-
全文索引(fulltext)
- 在特定的数据库引擎下才有,myisam
- 快速定位数据
2、索引的使用
-- 索引的使用-- 1、在建表的时候给字段增加索引-- 2、在创建完毕后,增加索引-- 显示所有的索引信息show index from 表名-- 增加一个索引alter table school.student add fulltext index `studentname`(`studentname`)-- explain 分析SQL执行的状况explain select * from student -- 非全文索引explain select * from student where match(studentname) against('刘')
3、索引的测试
创建一个 app_user表
CREATE TABLE `app_user` (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称',`email` VARCHAR(50) NOT NULL COMMENT'用户邮箱',`phone` VARCHAR(20) DEFAULT'' COMMENT'手机号',`gender` TINYINT(4) UNSIGNED DEFAULT '0'COMMENT '性别(0:男;1:女)',`password` VARCHAR(100) NOT NULL COMMENT '密码',`age` TINYINT(4) DEFAULT'0' COMMENT '年龄',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'
插入100万条数据
-- 插入100万数,耗时15.087 secDELIMITER $$CREATE FUNCTION mock_data()RETURNS INTDETERMINISTICBEGIN DECLARE num INT DEFAULT 1000000; DECLARE i INT DEFAULT 0; WHILE i < num DO INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES(CONCAT('用户',i),'12345678@qq.com',CONCAT('18',FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100)); SET i = i + 1; END WHILE; RETURN i;END;SELECT mock_data();`app_user` -- 创建完mock_data函数后使用
未创建索引测试查询时间
SELECT * FROM app_user WHERE `name` = '用户9999' -- 总耗时: 0.481 secexplain SELECT * FROM app_user WHERE `name` = '用户9999' -- 用explain检测执行sql情况
创建索引后测试查询时间
-- id 表名 字段名-- create index 索引名 on 表(字段)CREATE INDEX id_app_user_name ON app_user(`name`) -- 总耗时:2.418 sec
SELECT * FROM app_user WHERE `name` = '用户9999' -- 总耗时: 0.010 secexplain SELECT * FROM app_user WHERE `name` = '用户9999' -- 用explain检测执行sql情况
未使用索引之前是使用遍历查询数据,创建索引之后是使用索引查询数据。
可以看到,遍历查询的rows是992391,而索引查询的rows是1,大大节约时间
总结:
索引在数据量小的时候,用处不大,在数据量庞大的时候,用处很大
4、索引原则
- 索引不是越多越好
- 不要对经常变动的数据增加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上!
索引的数据结构
hash类型的索引
btree:innodb的默认数据结构
4、索引原则
- 索引不是越多越好
- 不要对经常变动的数据增加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上!
索引的数据结构
hash类型的索引
btree:innodb的默认数据结构
深入学习可以参考博客:
后话
到这里MySQL关于索引的浅层学习就结束了,如果有任何的问题和错误欢迎在评论区指出,我会一一回复!
ps:我的上一篇MySQL学习博客:,我都下一篇MySQL学习博客:,有兴趣的小伙伴可以参考学习!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月11日 23时03分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决数据库报ORA-02289:序列不存在错误
2021-05-10
map[]和map.at()取值之间的区别
2021-05-11
成功解决升级virtualenv报错问题
2021-05-11
【SQLI-Lab】靶场搭建
2021-05-11
【Bootstrap5】精细学习记录
2021-05-11
Struts2-从值栈获取list集合数据(三种方式)
2021-05-11
vscode中快速生成vue模板
2021-05-11
参考图像
2021-05-12
设计模式(18)——中介者模式
2021-05-12
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2021-05-12
BUU-MISC-认真你就输了
2021-05-12
BUU-MISC-caesar
2021-05-12
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
2021-05-12
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2021-05-12
一文理解设计模式--命令模式(Command)
2021-05-12
VTK:可视化之RandomProbe
2021-05-12
block多队列分析 - 2. block多队列的初始化
2021-05-12