「MySQL高级篇」MySQL索引原理,设计原则( 五 )


何时建立索引

  1. where中的查询字段
  2. 查询中与其他表关联的字段,比如外键
  3. 排序的字段
  4. 统计或分组的字段
何时达咩索引
  1. 表中数据量很少
  2. 经常改动的表
  3. 频繁更新的字段
  4. 数据重复且分布均匀的表字段(比如包含了很多重复数据,那此时多叉树的二分查找,其实用处不大,可以理解为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:在数据文件中读下一行的请求数 。如果你正进行大量的表扫描,该值较高 。通常说明你的表索引不正确或写入的查询没有利用索引 。
总结
  1. 索引简单来说就是一个排好序的数据结构 , 可以方便我们检索数据,而不需要盲目的进行全表扫描 。
    • 索引底层有很多种实现结构,这篇主要只是讲解了BTREE索引,如果对树这一数据结构还不太熟悉的小伙伴 , 可以关注我后续数据结构专栏 , 会整理关于普通树,二叉树,二叉排序树的文章 。
  2. 索引分类:
    1. 主键索引
    2. 辅助索引
这里我们还扩展了索引下推,是一个十分重要的知识点,需要仔细回味 。
  1. 索引的相关设计原则 , 索引虽好 , 但也不可贪杯,不能为了用索引而建索引 。
  2. 索引的相关语法,很容易上手的 。
  3. 查看索引的使用情况 。
下篇预告这篇我们主要讲的都是索引的理论知识,还简单介绍了索引的语法,可以看得出索引用起来其实是不难的,关键在于如何设计和优化 。
因为在很多情况下,索引其实很容易失效,我们要如何避免,以及如何正确使用索引来进行SQL优化,敬请期待下篇 。
参考文献
  • 掘金:https://juejin.cn/post/6844903967365791752
  • 思否:https://segmentfault.com/a/1190000020416577
  • MySQL45讲
  • 黑马MySQL高级篇

「MySQL高级篇」MySQL索引原理,设计原则

文章插图
收藏=白嫖 , 点赞+关注才是真爱?。。”酒恼氯缬胁欢灾?nbsp;, 还请在评论区指出,欢迎添加我的微信一起交流:Melo__Jun
友链
  • 我的一年后台练习生涯
  • 聊聊Java
  • 分布式开发实战
  • Redis入门与实战
  • 数据结构与算法
【「MySQL高级篇」MySQL索引原理,设计原则】

推荐阅读