何时建立索引
- where中的查询字段
- 查询中与其他表关联的字段,比如外键
- 排序的字段
- 统计或分组的字段
- 表中数据量很少
- 经常改动的表
- 频繁更新的字段
- 数据重复且分布均匀的表字段(比如包含了很多重复数据,那此时多叉树的二分查找,其实用处不大,可以理解为O(logn)退化了)
默认会为主键创建索引--primary
CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEX index_name[USINGindex_type]ON tbl_name(index_col_name,...)index_col_name : column_name[(length)][ASC | DESC]
查找索引结尾加上\G , 可以变成竖屏显示
select index from tbl_name\G;
删除索引drop INDEX index_name on tbl_name ;
变更索引1). altertabletb_nameaddprimarykey(column_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL 2). altertabletb_nameaddunique index_name(column_list); 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)3). altertabletb_nameaddindex index_name(column_list); 添加普通索引,索引值可以出现多次 。4). altertabletb_nameaddfulltextindex_name(column_list); 该语句指定了索引为FULLTEXT, 用于全文索引
查看索引使用情况show status like 'Handler_read%';-- 查看当前会话索引使用情况show global status like 'Handler_read%'; -- 查看全局索引使用情况
Handler_read_first:索引中第一条被读的次数 。如果较高,表示服务器正执行大量全索引扫描(这个值越低越好) 。?Handler_read_key:如果索引正在工作,这个值代表一个行被索引值读的次数,如果值越低,表示索引得到的性能改善不高,因为索引不经常使用(这个值越高越好) 。?
Handler_read_next :按照键顺序读下一行的请求数 。如果你用范围约束或如果执行索引扫描来查询索引列 , 该值增加 。?
Handler_read_prev:按照键顺序读前一行的请求数 。该读方法主要用于优化ORDER BY ... DESC 。?
Handler_read_rnd :根据固定位置读一行的请求数 。如果你正执行大量查询并需要对结果进行排序该值较高 。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键 。这个值较高,意味着运行效率低,应该建立索引来补救 。?
Handler_read_rnd_next:在数据文件中读下一行的请求数 。如果你正进行大量的表扫描,该值较高 。通常说明你的表索引不正确或写入的查询没有利用索引 。
总结
- 索引简单来说就是一个排好序的数据结构 , 可以方便我们检索数据,而不需要盲目的进行全表扫描 。
- 索引底层有很多种实现结构,这篇主要只是讲解了BTREE索引,如果对树这一数据结构还不太熟悉的小伙伴 , 可以关注我后续数据结构专栏 , 会整理关于普通树,二叉树,二叉排序树的文章 。
- 索引分类:
- 主键索引
- 辅助索引
这里我们还扩展了索引下推,是一个十分重要的知识点,需要仔细回味 。
- 索引的相关设计原则 , 索引虽好 , 但也不可贪杯,不能为了用索引而建索引 。
- 索引的相关语法,很容易上手的 。
- 查看索引的使用情况 。
因为在很多情况下,索引其实很容易失效,我们要如何避免,以及如何正确使用索引来进行SQL优化,敬请期待下篇 。
参考文献
- 掘金:https://juejin.cn/post/6844903967365791752
- 思否:https://segmentfault.com/a/1190000020416577
- MySQL45讲
- 黑马MySQL高级篇
文章插图
收藏=白嫖 , 点赞+关注才是真爱?。。”酒恼氯缬胁欢灾?nbsp;, 还请在评论区指出,欢迎添加我的微信一起交流:Melo__Jun友链
- 我的一年后台练习生涯
- 聊聊Java
- 分布式开发实战
- Redis入门与实战
- 数据结构与算法
推荐阅读
- 我的世界怎么用附魔台附魔书(我的世界用高级附魔台怎么附魔)
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
- 30 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-番外篇
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
- llinux下mysql建库、新建用户、用户授权、修改用户密码
- RedHat7.6安装mysql8步骤
- 29 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-终篇
- 究极无敌细节版 Mysql索引
- Mysql通过Canal同步Elasticsearch
- MySQL的日志文件