该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识)。地址:https://github.com/Snailclimb...

思维导图-索引篇

系列思维导图源文件(数据库+架构)以及思维导图制作软件—XMind8 破解安装,公众号后台回复:“思维导图” 免费领取!(下面的图片不是很清楚,原图非常清晰,另外提供给大家源文件也是为了大家根据自己需要进行修改)

下面是我补充的一些内容

为什么索引能提高查询速度

以下内容整理自:
地址: https://juejin.im/post/5b55b8...
作者 :Java3y

先从 MySQL 的基本存储结构说起

MySQL的基本存储结构是页(记录都存在页里边):

  • 各个数据页可以组成一个双向链表
  • 每个数据页中的记录又可以组成一个单向链表

      - 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录- 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。
    

所以说,如果我们写select * from user where indexname = 'xxx'这样没有进行任何优化的sql语句,默认会这样做:

  1. 定位到记录所在的页:需要遍历双向链表,找到所在的页
  2. 从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表了

很明显,在数据量很大的情况下这样查找会很慢!这样的时间复杂度为O(n)。

使用索引之后

索引做了些什么可以让我们查询加快速度呢?其实就是将无序的数据变成有序(相对):

要找到id为8的记录简要步骤:

很明显的是:没有用索引我们是需要遍历双向链表来定位对应的页,现在通过 “目录” 就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))

其实底层结构就是B+树,B+树作为树的一种实现,能够让我们很快地查找出对应的记录。

关于索引其他重要的内容补充

以下内容整理自:《Java工程师修炼之道》

最左前缀原则

MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。如User表的name和city加联合索引就是(name,city)o而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如下:

select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx; // 法命中索引            

这里需要注意的是,查询的时候如果两个条件都用上了,但是顺序不同,如 city= xx and name =xx,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的.

由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。ORDERBY子句也遵循此规则。

注意避免冗余索引

冗余索引指的是索引的功能相同,能够命中 就肯定能命中 ,那么 就是冗余索引如(name,city )和(name )这两个索引就是冗余索引,能够命中后者的查询肯定是能够命中前者的 在大多数情况下,都应该尽量扩展已有的索引而不是创建新索引。

MySQLS.7 版本后,可以通过查询 sys 库的 schemal_r dundant_indexes 表来查看冗余索引

Mysql如何为表字段添加索引???

1.添加PRIMARY KEY(主键索引)

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

2.添加UNIQUE(唯一索引)

ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

3.添加INDEX(普通索引)

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

4.添加FULLTEXT(全文索引)

ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

5.添加多列索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

参考

  • 《Java工程师修炼之道》
  • 《MySQL高性能书籍_第3版》
  • https://juejin.im/post/5b55b8...

你若盛开,清风自来。 欢迎关注我的微信公众号:“Java面试通关手册”,一个有温度的微信公众号。公众号后台回复关键字“1”,你可能看到想要的东西哦!

【思维导图-索引篇】搞定数据库索引就是这么简单相关推荐

  1. 思维导图Java篇(一)

    思维导图Java篇(一) 思维导图Java篇(二) 思维导图Java篇(三) 思维导图Java篇(四) 思维导图Java篇(五) 思维导图Java篇(六) 思维导图Java篇(一)

  2. 思维导图 旅行者篇(01)世界地图

    思维导图 旅行者篇 主要记录 世界各个国家 地区 的 景点 美食 文化 玩法等,每档一个人去一个地方旅行过,就会了解这个地儿的 景点 美食 文化 玩法 本篇是旅行者篇 的 第一篇,是 旅行者周游世界 ...

  3. 思维导图 基础篇(14)应用-阅读书籍

    系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...

  4. 呆呆带你手撸一个思维导图-基础篇

    希沃ENOW大前端 公司官网:CVTE(广州视源股份) 团队:CVTE旗下未来教育希沃软件平台中心enow团队 「本文作者:」 前言 你盼世界,我盼望你无bug.Hello 大家好,我是霖呆呆! 哈哈 ...

  5. 思维导图 基础篇(11)应用-文章分析-框架法

    系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...

  6. 思维导图 基础篇(18)TBLI 考试内容 评分标准

    1 TBLI的考试内容主要分为3个部分 思维导图 艺术创作:这里会给出一个主题,比如思维大图在生活中的应用.思维导图的意义...等.之后根据主题 会指出一副标准的思维导图.时长共2小时. 思维导图 高 ...

  7. 思维导图 基础篇(05)思维方法-高度思维

    系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...

  8. 思维导图 基础篇(01)概述

    系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...

  9. 思维导图 基础篇(02)认知大脑

    系列文章解读&说明: 本系列文章主要内容是 思维导图 基础课,旨在帮助更多 热爱学习的伙伴 更具体的了解思维导图,同时也会让 更多的伙伴从 思维导图 认知 误区中走出. 系列文章总纲链接为:专 ...

最新文章

  1. asp.net MVC2 Jquery
  2. 用户 'IIS APPPOOL\**' 登录失败的解决方案(项目部署到本地IIS上打开网页出现报错)...
  3. 人机接口设备攻击(HID Attack)
  4. C语言string.h文件函数汇总详解
  5. 认证服务器的搭建_SpringCloud搭建的认证中心和资源服务器的微服务项目源码分享...
  6. 企业微信加密消息体_用企业微信小程序发送消息
  7. 图片照片展示html5模板
  8. Codeforces Round #569 (Div. 2)A. Alex and a Rhombus
  9. python爬虫当当网图书信息_利用python爬虫可视化分析当当网的图书数据!
  10. 私有服务器虚拟化软件市场排名,三大服务器虚拟化软件比拼 谁是最佳?
  11. Linux系统交换空间详解
  12. Voyage自动驾驶测试场景开源文档介绍
  13. Win10屏幕截图自动保存方法
  14. 《迅雷链精品课》第三课:区块链主流框架分析
  15. ocs_lisence加密
  16. Android 引入高德地图 SDK
  17. 对称加密与非对称加密结合应用
  18. pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
  19. pstack无法使用的问题
  20. python炫酷动画源代码_(数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画...

热门文章

  1. java final 类_在Java中,final修饰的类有什么特点
  2. php传值到模板,laravel 实现向公共模板中传值 (view composer)
  3. 递归和函数栈与setjmp和longjmp的关系
  4. 9月20华为鸿蒙,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片
  5. 奥的斯GECS系统服务器手册,奥的斯电梯GECS 扶梯控制柜介绍.pdf
  6. matlab 绘图2
  7. “No module named ‘vtk.util‘;‘vtk‘ is not a package”问题完美解决
  8. Vivado之增量编译的实现
  9. 【FPGA】ODDR使用研究记录
  10. 统计学中的协方差矩阵(阵列信号基础)