MySQL索引的一些问题

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保留

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...

最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题, 错误显示: 未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。 其…

大家狂欢吧,我的Google帐号悲剧了

大家狂欢吧,我的Google帐号悲剧了 今早开始,鄙人在Google Code上突然被强行杯具,出现如下图。 最无奈的是询问Google Code管理组后得到回复如下。 然后管理员就睡觉去了|||…… 继续等待中,能恢复的话我会发个解决心得以警后人&am…

Hive简单实际操作(二)

两个常用的交互命令 不用启动hive就可以执行的命令 1. bin/hive -e "select * from default.animal;" 可以直接显示指定命令后的内容 2. 创建一个sql文件 vi hivef.sql 在文件内部添加你希望执行的命令例如: select * from default.animal; bin/hive -f /opt/module/…

在数据库中, 不用max()/min()找出一个列中最大/最小值的记录

不用max()/min()找出c1列中最大/最小值的记录 // 找出c1列中&#xff0c;c1是最小值的那条记录&#xff0c;不能用min() select * from t1 where c1 < all(select c1 from t1); // 找出c1列中&#xff0c;c1是最大值的那条记录&#xff0c;不能用max() select * from t1 …

C眼看J - 初窥JAVA

最近一直在学习JAVA&#xff0c;出发点并不是像当初学C那样&#xff0c;而只是想把JAVA作为下学期参加比赛的工具&#xff0c;带着这种“浮躁”的心态&#xff0c;使得我总是在想“这个用看么&#xff1f;”、“那个用看么&#xff1f;”。 这是第一次在掌握了一门语言&#xf…

为Mac OS X添加用Firefox搜索服务

为Mac OS X添加用Firefox搜索服务 在Mac OS X上&#xff0c;Firefox这种移植过来的程序往往不提供服务&#xff0c;比如只有safari才能利用服务搜索&#xff0c;经过一番实验终于自己做了一个服务&#xff1a; 第一步&#xff0c;打开Automator 第二部&#xff0c;新建一个服务…

jmeter持续集成测试中mongodb版本问题

jmeter测试mongodb&#xff0c;采用的是JSR223 Sampler脚本连接数据库&#xff0c;其中连接数据库用到了SCRAM-SHA1认证机制&#xff0c;代码如下&#xff1a; MongoCredential credential MongoCredential.createScramSha1Credential("username", "databaseN…

速度之王 — LZ4压缩算法与其他算法的比较

LZ4 (Extremely Fast Compression algorithm) 项目&#xff1a;http://code.google.com/p/lz4/ 作者&#xff1a;Yann Collet 本文作者&#xff1a;zhangskd csdn blog 简介 LZ4 is a very fast lossless compression algorithm, providing compression speed at 400MB/…

我用过的DOS命令

我用过的DOS命令 1、进入当前目录的子目录&#xff1a;cd xxx 2、放回到当前目录的上一子目录&#xff1a;cd.. 3、返回到根目录&#xff1a;cd/ 5、进入到指定目录&#xff1a;先键入指定目录的本目录如D盘&#xff1a;D: 然后回车键入cd xxx\xxx\xxx\xxx\xxx 如图&#xf…

XAMPP 无法启动解决

当安装完XAMPP后&#xff0c;在XAMPP Control Panel 里面无法启动apache,网上找了很多都是关于apache端口冲突问题&#xff0c;但我的不是&#xff0c;解决步骤如下&#xff1a;1&#xff1a;进入apache目录 conf/httpd.conf 改变监听端口&#xff1a;Listen 8080--启动任然失败…

lz4压缩算法--速度之王

简介 lz4是目前综合来看效率最高的压缩算法&#xff0c;更加侧重压缩解压速度&#xff0c;压缩比并不是第一。在当前的安卓和苹果操作系统中&#xff0c;内存压缩技术就使用的是lz4算法&#xff0c;及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。 压缩原理 lz…

Mac OS defaults命令(Access the Mac OS user defaults system)

defaults命令: 用于访问和修改Mac 上一些系统的默认设置&#xff08;Access the Mac OS user defaults system&#xff09; 仅修改当前用户设置&#xff0c;所以不应加sudo。 用法&#xff1a; 读取所有默认配置&#xff1a; defaults read 读取某项配置&#xff1a; defaults …

推荐12个绚丽的CSS3图片悬停效果

CSS3为我们开发提供了很多特效&#xff0c;如鼠标悬停&#xff0c;线性渐变&#xff0c;在web开发早期常用的是鼠标悬停&#xff0c;他是网页制作的常用特效之一&#xff0c;早期使用Flash可以制作非常炫的效果&#xff0c;后来慢慢演变成现在的是图片悬停效果&#xff0c;现在…

SAP和ABAP内存的区别

1、读取哈使用方法不同SAP内存使用SET/GET parameters方法&#xff1b;ABAP内存使用 EXPORT 和 IMPORT 方法&#xff1b;2、共享范围不同SAP内存可以被所有的主session访问&#xff0c;内存数据可以同一个session中不同程序之间&#xff0c;或者不同session之间&#xff1b;AB…

RocksDB事务实现TransactionDB分析

基本概念 1. LSN (log sequence number) RocksDB中的每一条记录(KeyValue)都有一个LogSequenceNumber(后面统称lsn)&#xff0c;从最初的0开始&#xff0c;每次写入加1。该值为逻辑量&#xff0c;区别于InnoDB的lsn为redo log物理写入字节量。 我有几张阿里云幸运券分享给你&…

Leetcode 771. Jewels and Stones

class Solution(object):def numJewelsInStones(self, J, S):""":type J: str:type S: str:rtype: int"""countcollections.Counter(S)ans0for j in J:anscount.get(j,0)return ans 转载于:https://www.cnblogs.com/zywscq/p/10562590.html

iptables规则的增删改查

1、查看 iptables -nvL --line-number -L 查看当前表的所有规则&#xff0c;默认查看的是filter表&#xff0c;如果要查看NAT表&#xff0c;可以加上-t NAT参数 -n 不对ip地址进行反查&#xff0c;加上这个参数显示速度会快很多 -v 输出详细信息&#xff0c;包含通过该规则的数…

2010.3.13郊野公园小记,以及参观托驼峰航线纪念碑

今天是周末&#xff0c;也是个晴好的天气(罪过&#xff0c;今年云南大旱&#xff0c;希望早点下雨吧&#xff09;。去了趟昆明西北郊的郊野公园&#xff0c;09年的时候成龙的<大兵小将>也曾经在此公园取景。 首先上图的是公园里的驼峰航线纪念碑&#xff0c;也差不多到清…

HDFS的读/写流程

1.HDFS读流程 HDFS读流程 1.1 、Client通过FileSystem.open(filePath)方法,与NN节点进行【rpc】协议通信&#xff0c;校验是否有权限是否存在&#xff0c;假如都ok&#xff0c;返回该文件的部分或全部的block的列表(包含各个block块的分布在DN地址的列表)&#xff0c;也就是返…

VS Code设置中文插件

Vscode是一款开源的跨平台编辑器。默认情况下&#xff0c;vscode使用的语言为英文(en) 1&#xff09;打开vscode工具&#xff1b; 2&#xff09;使用快捷键组合【CtrlShiftp】&#xff0c;在搜索框中输入“configure display language”&#xff0c;点击确定后&#xff1b; 3&a…