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,一经查实,立即删除!

相关文章

今日头条 mysql_今日头条的核心架构解析

一、产品背景今日头条是为用户提供个性化资讯客户端。下面就和大家分享一下当前今日头条的数据(据内部与公开数据综合)&#xff1a;5亿注册用户2014年5月1.5亿&#xff0c;2015年5月3亿&#xff0c;2016年5月份为5亿。几乎为成倍增长。日活4800万用户2014年为1000万日活&#x…

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

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

mysql中 视图的优缺点_数据库视图优缺点分析

视图作用是什么所谓视图(View)其实是执行查询语句后得到的结果&#xff0c;但这个查询结果可以仿真成数据表来使用&#xff0c;所以有人也称它为“虚拟数据表”&#xff0c;视图在操作上和数据表没有什么区别&#xff0c;但两者的差异是其本质是不同的&#xff1a;数据表是实际…

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按select导出_mysql 导出select结果到文本的几种方式

mysql -hxx -uxx -pxx -e "query statement" db > file例如&#xff1a;mysql -h127.0.0.1 -uroot -p000000 -e"select * from a" test > 1.txthost ip user password query statement database filename这样会输出列名信息&#xff0c;如…

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…

mysql max嵌套select_使用嵌套select子式 解决mysql不能叠加使用如max(sum())的问题

网上也有解决方案 有的有瑕疵 有的较复杂(mysql没有分析函数&#xff0c;可以使用变量实现) select sumScoreValue,studentid,studentName from sc_studentb, ( select sum (scoreValue) as sumScoreValue,studentid from sc_score group by studentid order by sumSc网上也有解…

mysql 检查记录存在_Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL...

我们在开发数据库相关的逻辑过程中&#xff0c; 经常检查表中是否已经存在这样的一条记录&#xff0c; 如果存在则更新或者不做操作&#xff0c; 如果没有存在记录&#xff0c;则需要插入一条新的记录。这样的逻辑固然可以通过两条sql语句完成。SELECT COUNT(*) FROM xxx WHERE…

python linux调试_python调试

以下是我做调试或分析时用过的工具的一个概览。如果你知道有更好的工具&#xff0c;请在评论中留言&#xff0c;可以不用很完整的介绍。日志没错&#xff0c;就是日志。再多强调在你的应用里保留足量的日志的重要性也不为过。你应当对重要的内容打日志。如果你的日志打的足够好…

猜数字游戏python程序用函数guesssecret_Python-三、函数

3.1 def语句和参数def ...(...)语句用于定义一个函数&#xff0c;以便后面调用函数&#xff0c;如&#xff1a;def hello(name): #定义函数hello&#xff0c;变元nameprint(hello name) #打印hello变元namenamein input() #定义namein变量&#xff0c;从键盘取值并赋给namein…

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_java读取中文分词工具(一)

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.RandomAccessFile;import java.util.StringTokenizer;/** 文本格式&#xff1a;已分词的中文文本&#xff0…

java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析

本文实例分析了java中成员变量与局部变量区别。分享给大家供大家参考。具体分析如下&#xff1a;成员变量&#xff1a;在这个类里定义的私有变量&#xff0c;属于这个类。创建以及使用成员变量public class Person {String name;String Sex;int age;double Height;public stati…

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保存登录信息_java – 保存登录详细信息(首选项)android

我有一个具有登录,注销功能的Android应用程序.登录表单包含用户名和密码以及登录按钮.我想在用户选中“记住我”复选框时保存用户名和密码.我的project.java文件如下所示&#xff1a;public class project extends Activity {private static final int IO_BUFFER_SIZE 4 * 102…