MySQL索引的一些问题

注意:本文基于MySQL的InnoDB引擎说明。

一、什么是最左前缀原则

对于该表,如果按照name字段来建立索引的话,采用B+树结构,大概的索引如下:

如果要进行模糊查找,查找name 以“张"开头的所有人的ID,即 sql 语句为:

select ID from table where name like '张%'

由于在B+树结构的索引中,叶子节点是一个有序的链表,当我们快速定位到 ID 为 100的张一后,可以直接向右遍历所有张开头的人,直到条件不满足为止。这种定位到最左边,然后向右遍历寻找的方式,就是我们所说的最左前缀原则

只是当个索引,在组合索引中更能感受到:

示例:一个(a,b,c)的组合索引。

  1. 通过a,b条件查询能不能使用或命中这个索引?-----能
  2. 通过b,c条件查询能不能使用或命中这个索引?-----不能
  3. 原因:索引文件具有B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

二、为什么用B+树作索引二不用哈希表作索引

1. 不支持模糊查询:哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。

2. 不支持范围查询:如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表

3. 哈希冲突,影响查询效率:索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加

三、主键索引和非主键索引的区别

例如下表(其实就是上面的表中增加了一个k字段),且ID是主键。

主键索引和非主键索引的示意图如下:

其中R代表一整行的值,

由图可以看出,主键索引和非主键索引的区别:主键索引叶子节点存放的是整行数据,非主键索引的叶子节点存放的是主键的值。非主键索引也被称为(二级索引、非聚簇索引),而主键索引也被称为聚簇索引

1)使用这两种结构进行查询,看看区别:

  • 如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
  • 如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表

四、聚集索引和非聚集索引的区别

聚集索引和聚簇索引是不同(不知道对不对,我找的资料是这样说的)

1. 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引

也就是说聚集索引的顺序就是数据的物理存储顺序。它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索引键的顺序进行排序,然后重新存储到磁盘上。因为数据在物理存放时只能有一种排列方式,所以一个表只能有一个聚集索引。

2. 非聚集索引: 索引顺序与物理存储顺序不同

五、为什么建议使用自增主键作索引

如果主键是自增的,每次插入的 ID 都会比前面的大,那么每次只需要在后面插入就行, 不需要移动位置、分裂等操作。从性能和存储空间方面考量,自增主键往往是更合理的选择。

六、覆盖索引

select * from T where k between 3 and 5  这种查询K的索引搜索到主键 然后搜索主键的索引 拿到具体的信息有回表
select ID from T where k between 3 and 5 这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
也就是说,你要找的数据已经在索引上,不需要再回表。

七、一个关于索引的题

CREATE TABLE `geek` (`a` int(11) NOT NULL,`b` int(11) NOT NULL,`c` int(11) NOT NULL,`d` int(11) NOT NULL,PRIMARY KEY (`a`,`b`),KEY `c` (`c`),KEY `ca` (`c`,`a`),KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

问题:哪个索引可以去掉?

主键 a,b 的聚簇索引组织顺序相当于 order by a,b ,也就是先按 a 排序,再按 b 排序,c 无序。
索引 ca 的组织是先按 c 排序,再按 a 排序,同时记录主键

所以索引ca 与 索引c 的数据是一模一样的

索引 cb 的组织是先按 c 排序,在按 b 排序,同时记录主键,

所以结论是ca可以去掉,cb保留

MySQL索引的一些问题相关推荐

  1. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  2. mysql索引教程_MySQL教程96-MySQL索引类型

    索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同.MySQL 索引可以从存储方式.逻辑角度和实际使用的角度来进行分类. 存储方式区分 根据存储方式的不同,MySQL 中常用的索引在 ...

  3. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  4. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  5. mysql 索引合并

    索引合并是mysql底层为我们提供的智能算法.本文就介绍了mysql 索引合并的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 索引合并是mysql底层为我们提 ...

  6. mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化

    本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...

  7. mysql索引底层实现原理_mysql的索引底层之实现原理

    MySQL索引背后的数据结构及算法原理 一.定义 索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构. 本质:索引是数据结构. 二.B-Tree m阶B-Tree满足以下条件: 1.每 ...

  8. 不会MySQL索引,面试官让回家等通知!

    " 你是不是对于 MySQL 索引的知识点一直都像大杂烩,好像什么都知道,如果进行深究的话可能一个也答不上来. 假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据 ...

  9. ElasticSearch 索引 VS MySQL 索引

    前言 这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 为此我搜索了 ...

  10. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

最新文章

  1. StringBuilder、StringBuffer、String区别
  2. 《转》cout和printf的混用而产生的顺序问题
  3. c枚举类型enum例题_SystemVerilog数据类型
  4. 《构建之法》读后感 二
  5. 一场不能只看结果的较量
  6. Vue优化策略_项目上线_02
  7. 云原生分布式应用运行时 Dapr 在阿里的实践
  8. 抢光儿童餐,是这届95后最后的倔强
  9. Insyde uefi 隐藏设置_文件隐藏工具Wise Folder Hider Pro便携版分享
  10. 【转】python常用工具代码
  11. Python3.7.2版本出现ModuleNotFoundError: No module named 'paramiko'解决办法
  12. Linux基础-获取命令帮助与命令的查找(1)
  13. 由一条微博引发的 — Xcode LLDB 调试断点总结
  14. Service Started!!!-end In Service while
  15. 解决keil注册机和编译错误的问题2020-12-28
  16. ORA-03113: 通信通道的文件结尾
  17. (十一)简单的2维机器人仿真器
  18. 王者荣耀 兵线刷新时间计数器 || 程咬金 水晶断兵线时间
  19. 算法---逆向旋转矩阵法求解矩阵绕圈走
  20. html2canvas 在ios 13.4.x 、 13.5.x 微信浏览器中失效无反应

热门文章

  1. 程序员的思维修炼》读书笔记
  2. 图tp delDataById问题
  3. Vue2.0王者荣耀助手
  4. python3 实现对比conf 文件差异
  5. HttpClient通过Post上传文件(转)
  6. 数据存储和界面展示(二)
  7. 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题
  8. JS 与Flex交互:html中的js 与flex中的actionScript通信
  9. 视频下载比想象中容易
  10. unity应用开发实战案例_「简历」STAR法则的实战应用,附手把手教学案例