mysql根据id主键查询是找到了就不再遍历后面的数据了吗_MySQL索引相关
来自:数据库开发
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索引相关相关推荐
- mysql自增主键查询及auto_increment修改。
核对当前report_cert_day表的主键report_id 的auto_increment为128,并且与report_id的最大值不冲突. SELECT AUTO_INCREMENT FROM ...
- MySQL数据库id主键或密码使用MD5加密
MD5原理: MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值,每 ...
- mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键
多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...
- hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...
前言"又要开始新项目了,一顿操作猛如虎,梳理流程加画图.这不,开始对流程及表结构了.我:吧啦吧啦吧啦 --老大:这个建表为啥还设置个自增 id ?直接用流水号(用户号/产品号)当主键不就行 ...
- mysql 主键查询性能_MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...
測试缘由 一个开发同事做了一个框架.里面主键是uuid.我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
Reference: https://blog.csdn.net/mchdba/article/details/52336203 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不 ...
- mysql自增主键返回---创建成功后返回用户的ID
mysql自增主键返回 查询id的sql SELECT LAST_INSERT_ID() 通过修改User.xml映射文件,可以将mysql自增主键返回: 如下添加selectKey 标签 <! ...
- MySQL自增主键auto_increment原理 与 自增主键出现间隙不连续现象的定位
一.背景: 1.1.业务描述与SQL: 为了保存机器上报信息(业务需求是每个机器只需保存最新的一条记录),原 SQL 语句如下(其中,machineId 的为唯一索引,t_report_pad 的 i ...
- 美团面试:MySQL 自增主键一定是连续的吗?
美团问数据库比较多,分享一位读者面试美团遇到的关于 MySQL 自增主键的问题. 下面是正文. 众所周知,自增主键可以让聚集索引尽量地保持递增顺序插入,避免了随机查询,从而提高了查询效率 但实际上,M ...
最新文章
- 华为ws851虚拟服务器,荣耀路由Pro无线中继设置 华为WS851桥接设置教程-192路由网...
- shell中使用echo命令改变输出显示样式
- rdd后面[]中的数字是啥意思
- 将 Observable.pipe 的输入参数手动分解
- wpa_supplicant 无线网络配置
- 【华为云技术分享】云图说 | 容器交付流水线ContainerOps,提升持续交付效率
- Loadrunner报错“Too many local variablesAction.c”解决方法
- WordPress 5.1.1 发布,修复 CSRF 漏洞
- vb从入门到精通_干货|让你 ArcGIS Engine从入门到精通的22个视频
- AnyLogic中的代码补全
- Java生成、解析二维码方案以及代码实现
- 明天过节,给将来的程序员们一个神奇的名单。兄弟们看准了(不说他们好坏,只求别去了才知道是传说中的外包)
- 微信群发红包原理 计算机,微信红包实现原理探讨
- Windows迅雷X去广告美化终结版Thunder X来了!
- Visual Studio 2017 配置AnkhSVN
- 网络分析工具——WireShark的使用(超详细)
- 【基础知识】Dom基础
- 弘辽科技:淘宝直通车推广无展现?该从何入手?
- 大众点评评论标签替换文字问题
- Windows成员服务器用户权利/本地策略审计
热门文章
- Struts 标签 —— Bean 标签
- 楼道声光控灯闪烁_照明灯闪烁其中一个原因就是它
- 交换机的源地址学习机制和帧转发方式习题
- 斐波那契数列——O(1)算法
- 列举python内置函数和使用方法_python学习交流 - 内置函数使用方法和应用举例
- koa mysql mongodb_koa如何连接MongoDB
- python中间件有哪些_python_21(Django中间件)
- pyqt一个text实时显示另一个text的内容_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
- 删除java速度变慢_Java正则表达式运行速度很慢
- android asynctask源码分析,Android异步任务AsyncTask的使用与原理分析