来自:数据库开发

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

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

例如对于下面这一张表

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

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

1select 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根据id主键查询是找到了就不再遍历后面的数据了吗_MySQL索引相关相关推荐

  1. mysql自增主键查询及auto_increment修改。

    核对当前report_cert_day表的主键report_id 的auto_increment为128,并且与report_id的最大值不冲突. SELECT AUTO_INCREMENT FROM ...

  2. MySQL数据库id主键或密码使用MD5加密

    MD5原理: MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值,每 ...

  3. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

    多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...

  4. hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...

     前言"又要开始新项目了,一顿操作猛如虎,梳理流程加画图.这不,开始对流程及表结构了.我:吧啦吧啦吧啦 --老大:这个建表为啥还设置个自增 id ?直接用流水号(用户号/产品号)当主键不就行 ...

  5. mysql 主键查询性能_MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  6. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...

    測试缘由 一个开发同事做了一个框架.里面主键是uuid.我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  7. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...

    Reference: https://blog.csdn.net/mchdba/article/details/52336203 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不 ...

  8. mysql自增主键返回---创建成功后返回用户的ID

    mysql自增主键返回 查询id的sql SELECT LAST_INSERT_ID() 通过修改User.xml映射文件,可以将mysql自增主键返回: 如下添加selectKey 标签 <! ...

  9. MySQL自增主键auto_increment原理 与 自增主键出现间隙不连续现象的定位

    一.背景: 1.1.业务描述与SQL: 为了保存机器上报信息(业务需求是每个机器只需保存最新的一条记录),原 SQL 语句如下(其中,machineId 的为唯一索引,t_report_pad 的 i ...

  10. 美团面试:MySQL 自增主键一定是连续的吗?

    美团问数据库比较多,分享一位读者面试美团遇到的关于 MySQL 自增主键的问题. 下面是正文. 众所周知,自增主键可以让聚集索引尽量地保持递增顺序插入,避免了随机查询,从而提高了查询效率 但实际上,M ...

最新文章

  1. 华为ws851虚拟服务器,荣耀路由Pro无线中继设置 华为WS851桥接设置教程-192路由网...
  2. shell中使用echo命令改变输出显示样式
  3. rdd后面[]中的数字是啥意思
  4. 将 Observable.pipe 的输入参数手动分解
  5. wpa_supplicant 无线网络配置
  6. 【华为云技术分享】云图说 | 容器交付流水线ContainerOps,提升持续交付效率
  7. Loadrunner报错“Too many local variablesAction.c”解决方法
  8. WordPress 5.1.1 发布,修复 CSRF 漏洞
  9. vb从入门到精通_干货|让你 ArcGIS Engine从入门到精通的22个视频
  10. AnyLogic中的代码补全
  11. Java生成、解析二维码方案以及代码实现
  12. 明天过节,给将来的程序员们一个神奇的名单。兄弟们看准了(不说他们好坏,只求别去了才知道是传说中的外包)
  13. 微信群发红包原理 计算机,微信红包实现原理探讨
  14. Windows迅雷X去广告美化终结版Thunder X来了!
  15. Visual Studio 2017 配置AnkhSVN
  16. 网络分析工具——WireShark的使用(超详细)
  17. 【基础知识】Dom基础
  18. 弘辽科技:淘宝直通车推广无展现?该从何入手?
  19. 大众点评评论标签替换文字问题
  20. Windows成员服务器用户权利/本地策略审计

热门文章

  1. Struts 标签 —— Bean 标签
  2. 楼道声光控灯闪烁_照明灯闪烁其中一个原因就是它
  3. 交换机的源地址学习机制和帧转发方式习题
  4. 斐波那契数列——O(1)算法
  5. 列举python内置函数和使用方法_python学习交流 - 内置函数使用方法和应用举例
  6. koa mysql mongodb_koa如何连接MongoDB
  7. python中间件有哪些_python_21(Django中间件)
  8. pyqt一个text实时显示另一个text的内容_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  9. 删除java速度变慢_Java正则表达式运行速度很慢
  10. android asynctask源码分析,Android异步任务AsyncTask的使用与原理分析