sql管理:索引超出范围必须为非负值并小于集合大小_java面试基础知识-数据库基础知识(数据库索引部分)...

1.1数据库架构:

如何设计一个关系型数据库?

存储模块(文件系统)用块或者页作为存储单位

程序实例:

存储管理

缓存机制 不宜过大,要有淘汰机制

SQL解析

日志管理

权限划分

容灾机制

索引管理

锁管理

1.2 索引

为什么要使用索引?

全表扫描:

数据库存储用块或者页存储,全表扫描时,需要将整个表加载到缓存中,当数据量很小的时候,缓存可以一次加载所有数据量,全表扫描就会比较快,而当数据量很大需要缓存多次加载,就会很慢,这个时候就要用到索引。

索引来源于字典,将关键信息集中起来,快速查找数据

因为索引能够避免全表扫描查找数据,提升检索效率

什么样的信息能成为索引?

能把该记录限定在一定查找范围中的字段

主键,唯一键以及普通键 能够让数据具备一定区分度的字段

索引的数据结构?

主流是B+Tree,还有Hash结构 bitMap索引,其中MySql不支持BitMap索引,同时基于MyISAM 或 InnoDB的MySql不支持Hash

二叉查找树:

有左右子树,对于树中的节点值X 他的左子树的任意节点值小于X,右字数任意节点值大于X,时间复杂度O(logn)

但在插入过程中可能会产生以下问题 导致IO次数变多时间复杂度变为O(n),比全表扫描都要慢得多

d733c51554fb18b102cefaeeeec4b7a6.png

B-Tree (通过合并上移下移来保证特征)

特征:

根节点至少包括两个孩子

树中每个节点最多含有M个孩子(m>=2)

除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子

所有终端叶子节点都位于同一层(即叶子节点高度一致)

假设每个非终端结点中包含N个关键字信息,其中1)Ki(i=1...n)为关键字,且关键字按顺序升序排序K(i-1)<Ki, 2)关键字的个数N必须满足:{cell(m/2)-1} <= n <= m-1,3)非叶子结点的指针P[1],P[2] P[3]... P[M]其中P[1]指向关键字小于K[1]的子树,P[m]指向关键字大于K[m-1]的子树,其他P[i]指向关键字属于(K[i-1],k[i])的子树

82935444a3652e423524df96b37b601f.png

B+-Tree (B-Tree 的变体)

非叶子节点的子树指针与关键字个数相同

非叶子节点得子树指针P[I],指向关键字【K[i],K[i+1]】的子树

非叶子节点仅用来做索引,数据保存在叶子节点中,即非叶子节点值和叶子节点值可能相同(保证树更矮)

所有叶子节点均有一个链指针指向下一个叶子节点并按大小顺序链接(可以方便横向跨子树进行统计,比如n>10 会直接统计10以后的叶子节点而不统计10以前的)

5b27d41816a5c9f3f7c95d9c634eecfa.png

结论:

B+Tree更适合用于做存储索引

1)B+树的磁盘读写代价更低,B+树的内部结构没有存储指向关键字具体信息的指针,所容纳的关键字多,一次IO可读取关键字数量更多。

2)B+树的查询效率更加稳定,由于非终端点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3)B+树更有利于数据库的扫描,只需要遍历节点就可以完成对整个数据库数据的扫描查找

Hash索引(理论上高于B+Tree):不稳定不支持线性查询

存放通过HASH算法计算出来的Hash值和行指针

优点

根据Hash的运算可以一次查找到数据所在的链表

缺点

仅仅能满足“=”,“in”,不能使用范围查询

无法被用来避免数据的排序操作

(HASH索引比较的是Hash算法计算后的值,不能保证和原有顺序(大小)一致)

组合索引中Hash是用组合全部索引值的方式进行查找的,无法通过组合索引中的部分索引键进行查询

无法避免表扫描,不同索引键可能存在相同索引值,需要通过访问实际数据进行比较

遇到大量Hash值相等的情况后,性能并不一定就会比B-Tree索引高(有可能出现极端情况,即很多不同数据计算出的索引值都一样变成线性存储结构)

84e66c2322a5059711456c49a14ad670.png

BitMap(位图)索引:

存储时按照状态分开,每个数据是否是这个值,按位存储

只适用于某个字段的值只有某种几个的情况

锁力度较大,不适合高并发联机系统,适用于并发低但是统计多的。

ba505d0d7d64b04bcc638d0a3beb4162.png

密集索引和稀疏索引的区别:

密集索引文件中的每个搜索码值都对应一个索引值,叶子节点不仅仅保存键值 并且保存了位于同一行记录里的其他列的信息,由于密集索引决定了一个表的物理排序,一个表只能有一个物理排列顺序故只能创建一个密集索引

稀疏索引文件只为索引码的某些值建立索引项,叶子节点仅保存键位信息和该行指针地址(或主键)定位到叶子后通过地址或主键寻找

2d21b10cd9ffe05d968c29428dec68a9.png

存储引擎:

MyISAM 索引和数据是分开存储的 (更适合大量的查询操作)

InnoDB 索引和数据是一起存储的 (支持事务 支持行级锁 set update更快)

有且仅有一个密集索引

如果一个主键被定义,该主键作为密集索引

如果没有主键被定义,该表的第一个唯一非空索引作为密集索引

若不满足以上条件,innodb会在内部生成一个隐藏主键

非主键索引存储箱关键为何其对应的主键值,两次查找(查找次级索引自身,再查找主键索引或者物理索引索引)

9658ada5406aa132407be897655c1828.png

如何定位并优化慢SQL?

该题目比较看经验

1)根据慢日志定位慢查询SQL(数据定义语言不会进入慢查询

慢日志:记录执行比较慢的SQL 执行命令:Show variables like‘ %quer%’

从上到下分别是:

SQL执行时间即超过多少时间算执行较慢,会记录超过这个时间的慢查询

慢日志开关:set global slow_query_log= on;

慢日志路径:set global long_query_time=1;(此句变量需要重连数据库后才生效)

使用命令修改后再重启数据库服务后会回复默认,可以在配置文件中修改

91a99cbbd9ec9fd699a72a8dc1bf6806.png

2)使用explain等工具分析sql:

显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句

type:mysql找到数据行的方式 最优—>最差(红字需要优化)

92adb845ddf0245351b096e7c3b5c573.png

extra:中出现以下两项表示mysql没有使用索引

be772565e54b07435af3b3a101b1339d.png

3+)修改sql(减少使用*,减少使用模糊查询)或者使SQL尽量走索引(like‘%赵%’这种形式不会走索引,但是like‘赵%会走索引’、强制索引等)

mysql的查询优化器会尽可能的使用索引并且使用最严格的索引消除尽可能多的数据行,最终目标是提交SQL语句查询数据行而不是排除数据行,sql优化器试图排除语句的目的在于排除数据行的素的越快,找到与条件匹配的数据行就越快,sql优化器会判断密集索引的叶子结点会带有数据,效率可能会低,故选择稀疏索引(有时候不一定会最优)。

联合索引的最左匹配原则的成因?

最左匹配原则:对于索引(A,B),有where A=1会走该索引,where A=1and B=1也会走该索引,where B=1则不会走该索引;

mysql会一直向右匹配直到遇到范围查询(<,>,between,like)就停止匹配,比如a=3 and b=2 and c>5 and d=6,如果建立(abcd)顺序的索引,d是用不到索引的,如果建立(abdc)顺序的索引,abdc的索引都可以用到,abd 的顺序可以任意调整;=和in可以乱序,比如a=1 and b=2 and c=3 建立(abc)索引可以任意顺序,musql的查询优化器会帮你优化成索引可以识别的形式。

mysql创建联合索引会对复合索引的第一个索引字段排序在此基础上再对第二个字段排序,其中第一个字段是有序的,第二个字段是无序的、所以用第一个字段是可以用到索引的,单独用第二个字段是用不到索引的

从col3,col2,col1做索引会做出下图所示的索引,单使用col2无法走索引。

a60cfdf768270811397c48640fb068ea.png

索引是建立的越多越好吗?

1)否定的,物极必反,数据量小的表不需要建立索引,建立会增加额外的索引开销

2)数据变更需要维护索引,更多的索引意味着更多的维护成本

3)更多的索引意味着需要更多的空间。

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

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

相关文章

编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

05-01: Introduction to Parsing 语法分析parser的作用&#xff1a;05-02: Context Free Grammars 上下文无关文法CFG&#xff08;上下文无关文法&#xff09;回答了一个字符串是否属于某语言&#xff1a;CFG的组成&#xff1a;终止符非终止符开始符生成式生成式production &am…

mysql永远不用utf8_永远不要在 MySQL 中使用「utf8」

题图&#xff1a;by apple from Instagram本文出自极客邦「聊聊架构」公众号的编译。我自己当年也被这个问题坑过&#xff0c;当时并没有如此详细的分析文章。我觉得有责任再次分享一下&#xff0c;让更多人知道这个事情。程序员不帮助程序员&#xff0c;还能指望谁呢&#xff…

sqoop mysql parquet_Sqoop抽取Hive Parquet表数据到MySQL异常分析

温馨提示&#xff1a;要看高清无码套图&#xff0c;请使用手机打开并单击图片放大查看。Fayson的github&#xff1a;https://github.com/fayson/cdhproject1.问题描述在CDH集群中我们需要将Hive表的数据导入到RDBMS数据库中&#xff0c;使用Sqoop工具可以方便的将Hive表数据抽取…

mysql架设_主从mysql架设

主从mysql架设二进制安装mysqltar xvf mysql-5.1.46-linux-i686-glibc23.tar -C /usr/localcd /usr/localln -sv mysql-5.1.46-linux-i686-glibc23.tar mysqlcd mysqlgroupadd mysqluseradd -g mysql -s /sbin/nologin -M -r mysqlmkdir /mysql/datachown -R mysql.mysql /mysq…

日志文件和mysql同步到kafka_logstash_output_kafka:Mysql 同步 Kafka 深入详解

0、题记实际业务场景中&#xff0c;会遇到基础数据存在 Mysql 中&#xff0c;实时写入数据量比较大的情景。迁移至kafka是一种比较好的业务选型方案。而mysql写入kafka的选型方案有&#xff1a;方案一&#xff1a;logstash_output_kafka 插件。方案二&#xff1a;kafka_connect…

java 命令行参数 _java命令行参数

原标题&#xff1a;java命令行参数命令行参数就是main方法里面的参数String[] args他就是一个数组&#xff0c;args只是数据类型的一个名称&#xff0c;就是一个数组的变量&#xff0c;名称无所谓&#xff0c;类型没变就行了。这个就是程序的入口点。如图7.4所示&#xff1a;图…

java 最小生成树_图的最小生成树(java实现)

1.图的最小生成树(贪心算法)我两个算法的输出都是数组表示的&#xff0c;当前的索引值和当前索引对应的数据就是通路&#xff0c;比如parent[2] 5;即2和5之间有一个通路&#xff0c;第二个可能比较好理解&#xff0c;第一个有点混乱是什么&#xff1f;将一个有权图中的 所有顶…

java 自定义注解 生成json_用自定义注解实现fastjson序列化的扩展

这篇文章起源于项目中一个特殊的需求。由于目前的开发方式是前后端分离的&#xff0c;基本上是通过接口提供各个服务。而前两天前端fe在开发中遇到了一些问题&#xff1a;他们在处理字符串类型的时间时会出现精度丢失的情况&#xff0c;所以希望后台是以时间戳的形式返回给前端…

工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

简单工厂不是一个标准的设计模式&#xff0c;但是它实在是太常用了&#xff0c;简单而又神奇&#xff0c;所以还是需要好好掌握的&#xff0c;就当是对学习设计模式的热身运动吧。为了保持一致性&#xff0c;我们尽量按照学习其它模式的步骤来进行学习。1 场景问题大家都知道&…

java asm jndi_GitHub - Q1ngShan/JNDI: JNDI 注入利用工具

JNDI 注入利用工具介绍本项目为 JNDI 注入利用工具&#xff0c;生成 JNDI 连接并启动后端相关服务&#xff0c;可用于 Fastjson、Jackson 等相关漏洞的验证。本项目是基于 welk1n 的 JNDI-Injection-Exploit&#xff0c;在此项目的基础服务框架上&#xff0c;重新编写了攻击利用…

java中fis和fos_java中-的流-与操作

/*字节输出流 OutputStrema&#xff1a;* OutputStream抽象类* write(int b); 将指定的字节写入此流中* write(byte[] b); 将指定的数组 输入此流中* write(byte[] b , int a , int c); 将指定的数组输入此流中 从a索引开始 获取c 个* close(); 将此流关闭 并释放资源* fl…

yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort

目标跟踪问题一直是计算机视觉的热点任务之一&#xff0c;简单的可以分为单目标跟踪与多目标跟踪&#xff0c;最常见的目标跟踪算法都是基于检测的跟踪算法&#xff0c;首先发现然后标记&#xff0c;好的跟踪算法必须具备REID的能力。今天小编斗胆给大家推荐一个结合传统算法跟…

类java的步骤_java类加载的过程

类加载就是三个过程&#xff1a;加载、链接、初始化链接又可以分为验证、准备、解析1.加载将class字节码文件通过类加载器装入内存中2.验证确保当前class文件的字节流所包含的内容符合当前JVM的规范要求&#xff0c;并且不会出现危害JVM自身安全的代码&#xff0c;当前字节流不…

java拓展接口_Java拓展接口-default关键词

Java接口在使用过程中有两点规定&#xff1a;1、接口中只能有定义方法名、方法返回类型&#xff0c;不能有方法的实现。2、实现接口的类&#xff0c;必须实现接口中所有的方法。例如下面的例子&#xff1a;//定义接口public interface Action {//接口中的方法定义&#xff0c;只…

java编写通信录管理系统_Java 实现通讯录管理系统教程

本文实例为大家分享了java实现通讯录管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下完成项目的流程&#xff1a;1.根据需求&#xff0c;确定大体方向2.功能模块分析3.界面实现4.功能模块设计5.coding6.代码测试下面是源代码&#xff1a;import java.awt.Co…

java姑娘_初识java这个小姑娘(二)

正版疯狂java讲义第5版编程教材76.5元(需用券)去购买 >妙解垃圾回收机制周一&#xff0c;早高峰&#xff01;&#xff01;&#xff01;五个字&#xff0c;说尽心中的绝望&#xff01;&#xff01;&#xff01;一段考验一个人耐力、智力、开车技术以及脾气的路。 我把车开进了…

JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

事件循环(Event Loop)&#xff0c;是每个JS开发者都会接触到的概念&#xff0c;但是刚接触时可能会存在各种疑惑。众所周知&#xff0c;JS是单线程的&#xff0c;即同一时间只能运行一个任务。一般情况下这不会引发问题&#xff0c;但是如果我们有一个耗时较多的任务&#xff0…

java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

当参数传递为基本数据类型时&#xff0c;参数变化不保留&#xff0c;基本数据类型参数传值当参数传递为引用数据类型时&#xff0c;参数变化会保留&#xff0c;引用数据类型参数传址//基本数据类型在别处被重新赋值&#xff0c;则本体不受影响&#xff0c;其值不变//引用型数据…

java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色

因此,我下载了“原始”图像(不是正方形),对其进行了修改,使其变为正方形,运行您的代码,得到了java.awt.image.ImagingOpException&#xff1a;无法转换src图像异常,将BufferedImage.TYPE_INT_RGB更改为BufferedImage .TYPE_INT_ARGB并得到…import java.awt.geom.AffineTransfo…

python 数据库连接池_【转】Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作&#xff0c;但每次连接mysql请求时&#xff0c;都是独立的去请求访问&#xff0c;比较浪费资源&#xff0c;而且访问数量达到一定数量时&#xff0c;对mysql的性能会产生较大的影响。因此实际使用中&#xff0c;通常会…