1. 什么是最左前缀原则?

以下回答全部是基于MySQL的InnoDB引擎

例如对于下面这一张表

如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下

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

select ID from table where name like '张%'

由于在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺序排序的,索引在查找的时候,可以快速定位到 ID 为 100的张一,然后直接向右遍历所有张开头的人,直到条件不满足为止。

也就是说,我们找到第一个满足条件的人之后,直接向右遍历就可以了,由于索引是有序的,所有满足条件的人都会聚集在一起。

而这种定位到最左边,然后向右遍历寻找,就是我们所说的最左前缀原则。

2. 为什么用 B+ 树做索引而不用哈希表做索引?

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

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

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

3. 主键索引和非主键索引有什么区别?

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

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

其中R代表一整行的值。

从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。

根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。

1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。

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

现在,知道他们的区别了吧?

4. 为什么建议使用主键自增的索引?

对于这颗主键索引的树

如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了

但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,那么需要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,如果刚好 R4 所在的数据页已经满了,需要进行页分裂操作,这样会更加糟糕。

但是,如果我们的主键是自增的,每次插入的 ID 都会比前面的大,那么我们每次只需要在后面插入就行, 不需要移动位置、分裂等操作,这样可以提高性能。也就是为什么建议使用主键自增的索引。

mysql非主键索引_主键索引和非主键索引解析相关推荐

  1. python 提示按任意键退出_详解Python实现按任意键继续/退出的功能 python请按任意键继续 什么意思...

    请问python中如何实现按任意键继续效果.嗯,请问哪里有中文的手册下载吗?还有,小编试了,pause命令编译时不认啊,. python请按任意键继续 什么意思 pause命令就是按任意键继续,你按需 ...

  2. datetime 索引_超全的数据库建表/SQL/索引规范,适合贴在工位上!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:又一程序员进了ICU:压垮一个家庭,一张结算单就够 个人原创100W+访问量博客:点击前往,查看更多 来源:ht ...

  3. oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响

    [引言] 本文基于如下文章进行的实验,讲述聚簇因子对SQL索引的影响. 链接如下: https://www.modb.pro/db/40283 一张表上有索引,sql在执行的时候却不走索引的原因有很多 ...

  4. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件

    这道题考查索引生效条件.失效条件.像这类问题才其实很有意义,建议各位以后面试其他伙伴的时候,多侧重这类问题的提问,比考察一般概念性的问题好多了. 能大概考察应聘者对写的程序是有注重做优化,提高代码质量 ...

  5. jquery获取元素的索引_如何在jQuery中获取具有特定索引的元素

    jquery获取元素的索引 In this post, we are going to discuss how to get an element with a specific index. jQu ...

  6. flask sql外键使用_如何在SQL中使用外键?

    flask sql外键使用 Basically, Foreign Key represents relationship between tables. 基本上, 外键代表表之间的关系 . Synta ...

  7. python 提示按任意键退出_详解Python实现按任意键继续/退出的功能

    前言 要实现该功能,需要的就是暂停程序.等待并捕捉用户的一个键盘输入,然后继续执行.Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux. msvcrt 中的 g ...

  8. python运行后按任意键退出_实现python版本的按任意键继续/退出

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要 ...

  9. mysql是一门编程语言吗_掌握一门编程语言对非程序员的工作和生活有多大好处?...

    编程的作用之一,就是可以减少重复性的劳动,所以非程序员如果能够掌握一门编程语言的话,可以大幅度地提高工作效率和质量:甚至有些时候不需要掌握编程语言,只要懂一些程序员常用的软件,就可以让你的工作事半功倍 ...

  10. python字典中给一个键增加值_在Python字典中向单个键添加多个值

    Python字典今天真的很吸引我.我一直在堆栈上奔波,试图找到一种方法,将一个新值简单地附加到python字典中的现有键上,但每次尝试都失败,使用的语法与这里相同.在 我要做的是:#cursor se ...

最新文章

  1. JSR303(Bean Validation 1.0)
  2. Ubuntu下安装依赖包问题总结
  3. java写龟兔赛跑_简单的实现java多线程——龟兔赛跑
  4. 浅谈对BFC的认识,以及用bfc解决浮动问题
  5. Python打包分发工具setuptools简介
  6. java 补充日期_Java 9对可选的补充
  7. C语言深度解剖读书笔记(1.关键字的秘密)
  8. 近期 AI 领域,招聘招生信息汇总
  9. 铺铜需要把agnd和dgnd分开_AGND和DGND的秘密——混合信号器件的接地原则
  10. [WC2018]即时战略——动态点分治(替罪羊式点分树)
  11. 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层(转)...
  12. pr.exe、Churrasco.exe、ms10048.exe用法及提权原理 上帝模式
  13. 飞思卡尔mc9s08烧录方法_编程器USBDM 读写MC9S08 MCF51 批量烧录刷写NXP飞思卡尔单片机...
  14. 【C++】C++ 内存分配(new,operator new)详解
  15. 如何转换图片格式为png?图片格式如何进行转换?
  16. Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!...
  17. visio自己画的图怎么填充_VISIO自定义图形填充
  18. Elasticsearch索引安装使用
  19. 苹果M1芯片的Mac怎么关闭SIP?M1 mac关闭Sip方法教程!
  20. 车辆仪表盘测试平台研究

热门文章

  1. Flink1.15源码解析--启动TaskManager
  2. 自定义修改QQ在线状态源码
  3. JavaScript之变量提升
  4. 微信和QQ凌晨崩了 网民:该崩溃的是我(微信登不上没钱吃早饭)
  5. 罗马数字转换阿拉伯数字0~3999
  6. XML 中的 xmlns、xmlns:xsi、xsi:schemaLocation
  7. Spring Boot Starters
  8. Unity调用android相册获取图片或视频
  9. JS中的offsetWidth、offsetHeight、clientWidth、clientHeight等等的详细介绍
  10. 学会这个软件,轻松月入过万!