首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

03-面试必会-Mysql篇

, 单列索引又分为 普通索引:MySQL 中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。...唯一索引:索引列中的值必须是唯一的,但是允许为空值 主键索引:是一种特殊的唯一索引,不允许有空值 全文索引: 只有在 MyISAM 引擎、InnoDB(5.6 以后)上才能使⽤用,而且只能在...需要查询二次 如果使用MyISAM存储引擎 , 会首先根据索引查询到数据行指针, 再根据指针获取数据 如果是InnoDB存储引擎 , 会根据索引查找指定数据关联的主键 ID , 再根据主键 ID 去主键索引中查找数据...知道什么叫覆盖索引嘛 ? 覆盖索引是指只需要在一棵索引树上就能获取 SQL 所需的所有列数据 , 因为无需回表查询效率更高 实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。...什么样的字段需要建索引, 什么样的字段不需要 ?

25110

个人永久性免费-Excel催化剂功能第57波-一键生成完全组合的笛卡尔积结果表

在数据库的多表查询中,通常会有各种连接关系,同样地在Excel环境中,也有很大的场景需要用到类似数据库的多表查询,如经典的VLOOKUP就是其中一种类似LEFT JOIN查询的查询效果。...在很多时候需要生成一个完全数据组合时,也是需要用到数据库的笛卡尔积查询表的原理,让两个表产生任意的完全组合,此次Excel催化剂同样将非常有价值的数据库技术,搬到Excel环境中供普通用户无需掌握任何数据库查询知识...笛卡尔积查询表是什么?...一般来说多表查询时,会对笛卡尔积查询表返回的结果进行筛选,如VLOOKUP的效果就是筛选出源表中LookupValue与查询表的查找列对应的某一行记录值相同的行,而不是返回所有查找表的行,所以一般笛卡尔积查询表会产生大量的数据...若需在细节上更多的学习,建议使用视频的方式来查看,更加形象,更加震撼,需要视频的可私信获取视频地址。

65330
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL索引的原理,B+树、聚集索引和二级索引的结构分析

    b树通常意味着所有的值都是按顺序存储的,并且每一个叶子也到根的距离相同。B树索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取数据。下图就是一颗简单的B数。 ?...B+树每次查找都必须到叶子节点才能获取数据,而B树不一定,B树可以在非叶子节点上获取数据。因此B+树查找的时间更稳定。...B+树的每一个叶子节点都有指向下一个叶子节点的指针,方便范围查询和全表查询:只需要从第一个叶子节点开始顺着指针一直扫描下去即可,而B树则要对树做中序遍历。...只访问索引的查询 查询只需要访问索引,无需访问数据行。这种索引叫做覆盖索引。 一些限制: 如果不是按照索引的最左列开始查找,无法使用索引。...假如磁盘中的某一个已经存满了,但是新增的行要插入到这一页当中,存储引擎就会把该页分裂成两个页面来容纳该行,这就是一次页分裂操作。页分裂会导致表占用更多的磁盘空间。

    3.1K30

    揭开MySQL“锁”的神秘面纱

    通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1 也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作...(更新),则先判断此刻version的值是否与刚刚查询出来时version的值相等。...如果更新时发现此刻的version值与刚获取出来version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。...悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟Java中的Synchronized很相似,所以悲观锁需要耗费较多的时间。...- 行锁 - 行锁,由字面意思理解,就是给某一行加上锁,也就是一条记录加上锁。

    36820

    数据库索引

    使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。 索引的分类 聚集索引:对正文内容按照一定规则排列的目录称为聚集索引。   ...在哈系索引的中查询一个像“Jesus”这样的值,并得到对应行的在内存中的引用,明显要比扫描全表获得值为“Jesus”的行的方式快很多。...索引已经排序意味着查询一个名字会快很多,因为名字首字母为‘J’的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。 数据库索引里究竟存的是什么?   ...索引存储了指向表中某一行的指针   如果我们在索引里找到某一条记录作为索引的列的值,如何才能找到这一条记录的其它值呢?这是很简单,数据库索引同时存储了指向表中的相应行的指针。...同样的,就像一本书的索引包含页码一样,数据库的索引包含了指针,指向你在SQL中想要查询的值所在的行。 使用数据库索引会有什么代价?   那么,使用数据库索引有什么缺点呢?

    1K00

    mysql的乐观锁使用_mysql悲观锁需要注意什么

    也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作...,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。...悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。...与共享锁类型,在需要执行的语句后面加上 for update就可以了 行锁 行锁,由字面意思理解,就是给某一行加上锁,也就是一条记录加上锁。...执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是行锁。 表锁 表锁,和行锁相对应,给这个表加上锁。

    74210

    MySQL面试题(最全、超详细)——定位慢查询、聚簇索引、覆盖索引、深分页优化、sql优化、并发事务问题、隔离级别、undo log与redo log、主从同步

    这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取数据的方式,就称之为回表查询。...(先走二级索引找到主键值,再根据主键值到聚集索引中找到对应的行数据)4.7 什么是覆盖索引覆盖索引是指查询使用了索引,并且需要返回的列 在该索引中全部能够找到。...最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。...锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)mvcc : 多版本并发控制九、解释一下MVCC全称 Multi-Version Concurrency Control...undo log:作用:记录回滚日志,存储老版本数据在内部会形成版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表readView解决的是一个事务查询选择版本的问题根据

    84930

    MySQL 排序、分页查询、聚合查询

    函数 说明 SUM 计算某一列的合计值,该列必须为数值类型 AVG 计算某一列的平均值,该列必须为数值类型 MAX 计算某一列的最大值,可以对字符串排序 MIN 计算某一列的最小值,可以对字符串排序...第二高的薪水 题目: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。...第N高的薪水 题目: 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。...查找重复的电子邮箱 题目: 编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。...作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

    3.1K40

    mysql的锁机制最全详解

    )-会让整个库处于只读状态 使用场景: 做全库逻辑备份 全库逻辑备份 为什么要进行全局锁才能进行数据备份呢?...MDL写锁(排它锁),这个锁和其他读写锁都互斥.也就是当前数据变更或者查询或者结构变更,都必须等其他的MDL写锁释放后才能执行 行锁 行锁是引擎层,各个引擎自己实现的(MyISAM不支持行锁,所以该引擎只能一次进行一个线程的...update操作) 在事务中:行锁会在需要使用某一行或多行数据时加上,但是所有的行锁都会在该事务提交才会释放也就是说,别的线程需要访问改行数据,就需要等待线程的事务提交之后才能访问 举例: 线程A执行以下操作...id=2上锁.如果此时线程B访问t1的id=1是无法访问的,即使第一条语句已经执行完成了 线程B只有在线程A进行了commit操作之后才能获取其中的数据 复制代码 所以,对于我们来说需要注意的点就是:在进行事务操作时...作用:记录在被当前事务管理时,加上锁之后不会被其他事务获取产生“重复读”和“数据脏读”的问题 间隙锁 属于行锁的一种情况 间隙的意思就是between中的数据 在主键索引id中有多个数据未填充,这个时候如果两个线程

    1K20

    面试前必须知道的MySQL命令【expalin】

    前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。...1.2为什么需要explain命令 我们很多时候编写完一条SQL语句,往往想知道这条SQL语句执行是否高效。...决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。...range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。...const、system:该表至多有一个匹配行,在查询开始时读取,或者该表是系统表,只有一行匹配。其中 const 用于在和 primary key 或 unique 索引中有固定值比较的情形。

    1K20

    这是我见过最有用的Mysql面试题,面试了无数公司总结的(内附答案)

    4.什么是数据库中的细分? 数据库表中的分区是分配用于在表中存储特定记录的空间。 5.什么是数据库中的记录? 记录(也称为数据行)是表中相关数据的有序集合。 6.什么是表中的列?...有各种数据库关系,即 1.一对一的关系 2.一对多的关系 3.多对一的关系 4.自指关系 23.什么是查询? 数据库查询是从数据库表或表组合中获取数据或信息的请求。...我们需要对Table具有DELETE权限才能使用DELETE命令 我们至少需要对表具有ALTER权限才能使用TRUNCATE命令 65....70.什么是用户定义的功能? 顾名思义,这些是由用户根据其要求编写的。 用户定义的函数是编写为在需要时使用逻辑的函数。 71.什么是用户定义功能的所有类型?...让我们看一下重要的SQL查询以进行面试 76.如何从表中获取唯一记录?

    27.1K20

    快速学习-Presto简介

    1.4 Presto数据模型 1)Presto采取三层表结构: Catalog:对应某一类数据源,例如Hive的数据,或MySql的数据 Schema:对应MySql中的数据库 Table:对应MySql...中的表 ?...每一行的长度等于下一行的起始便宜减去当前行的起始便宜。 boolean valueIsNull[] 表示某一行是否有值。如果有某一行无值,那么这一行的便宜量等于上一行的偏移量。...在查找时,首先找到某一行的id,然后到字典中获取真实的值。 1.5 Presto优缺点 Presto中SQL运行过程:MapReduce vs Presto ?...2)能够连接多个数据源,跨数据源连表查,如从Hive查询大量网站访问记录,然后从Mysql中匹配出设备信息。 3)部署也比Hive简单,因为Hive是基于HDFS的,需要先部署HDFS。 ?

    1.8K30

    MySQL事务和锁——《MySQL DBA工作笔记》

    【一个事物在读的时候,禁止读取未提交的事务】 不可重复读 不可重复读是指在一个事务范围内多次查询却返回了不同的数据值,这是由于存在查询间隔,被另一个事务修改并提交了。...【复述一下】 假设事务A获取了表中的行666,就相当于获得了共享锁,此时A可以读取数据,其他事务也可以获得行666的共享锁,所以多个共享锁是可以并行指的是多个事务可以读取相同的行,但是一旦某行被获取了共享锁...(这也是为什么需要进行索引优化的原因) 【行锁定的范围问题】 行锁:对索引项加锁,锁定一条记录 间隙锁: 编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。...事务A获得了表中某一行的共享锁,事务B申请了表的写权限,这时候就会产生矛盾。 【关于意向锁】 首先,意向锁是一种表锁。 意向共享锁:事务获得表中的某一行的共享锁前,需要先获得整张表的意向共享锁。...意向排他锁:事务获得表中的某一行的排他锁前,需要先获得整张表的意向排他锁。 意向锁的加锁过程是自动完成的。

    93230

    Mysql的各种锁——Mysql系列(三)

    你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。...如果你要做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务。这也是为什么需要在低峰期做ddl 变更。...意向锁能够将检查行锁的时间复杂度由 O(n) 变成 O(1),其加锁的具体做法就是,当一个事务想要获取表中某一行的(共享/排他)锁的时候,它会自动尝试给当前表的加上意向(共享/排他)锁 。...WRITE 之类的语句在指定的表上获取排他锁(X 锁)。 为了使多粒度级别的锁定变得可行,InnoDB 使用意向锁。 意向锁是表级锁,指示事务稍后对表中的行需要哪种类型的锁(共享或独占)。...意向锁定协议如下: 在事务可以获取表中行的共享锁之前,它必须首先获取表上的 IS 锁或更强锁。 在事务可以获取表中一行的排他锁之前,它必须首先获取表上的 IX 锁。

    52300

    全面透彻,MySQL 正确的慢查询处理姿势

    我们一起来get下MySQL慢查询的正确姿势。 一、查询SQL执行到底经历了什么? 首先需要明确:一个查询SQL的执行到底经历了什么?...1)如未开启应用查询缓存,则直接忽略查询缓存的检查; 2)执行过程中,如同时对于被扫描的行可能加锁,同时也可能会被其他sql阻塞 二、查询SQL为什么会慢?...仅对索引进行查询(Index-only queries):如果查询的列都位于索引中,则不需要读取元组的值。...例如你不能利用索引查找在某一天出生的人。 不能跳过某一索引列。例如,你不能利用索引查找last name为Smith且出生于某一天的人。 存储引擎不能使用索引中范围条件右边的列。...根据执行计划依次扫描相关表中的行,不在数据缓冲区的走IO存储引擎扫描表的性能消耗参考下面的list,消耗从大到小: 全表扫描>全索引扫描>部分索引扫描>索引查找>唯一索引/主键查找>常量/null 5.3

    1.8K30

    通俗易懂讲数据仓库之【缓慢变化维】

    SCD问题的几种解决方案 以下为解决缓慢变化维问题的几种办法: 保留原始值 改写属性值 增加维度新行 增加维度新列 添加历史表 SCD解决方案 - 保留原始值 某一个属性值绝不会变化。...事实表始终按照该原始值进行分组。例如: 出生日期的数据,始终按照用户第一次填写的数据为准。 SCD解决方案 - 改写属性值 对其相应需要重写维度行中的旧值,以当前值替换。因此其始终反映最近的情况。...当一个维度值的数据源发生变化,并且不需要在维度表中保留变化历史时,通常用新数据来覆盖旧数据。这样的处理使属性所反映的中是最新的赋值。 例如: 用户维度表 修改前: ? 修改后: ?...SCD解决方案 - 增加维度新列 用不同的字段来保存不同的值,就是在表中增加一个字段,这个字段用来保存变化后的当前值,而原来的值则被称为变化前的值。总的来说,这种方法通过添加字段来保存变化后的痕迹。...数仓项目-拉链表技术介绍 数据仓库的数据模型设计过程中,经常会遇到这样的需求: 表中的部分字段会被update,例如: 用户的地址,产品的描述信息,品牌信息等等; 需要查看某一个时间点或者时间段的历史快照信息

    6.2K54

    Mysql高频面试题

    4、列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况? 答:它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。...简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。>所以第三范式具有如下特征: >>1. 每一列只有一个值 >>2. 每一行都能区分 >>3....简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。...13、什么是索引?请简述常用的索引有哪些种类? 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。...当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。 17、非聚簇索引一定会回表查询吗? 答:不一定。

    86010

    精心为你准备的最全的20道Mysql面试题。

    对于一行数据若是想实现可重复读取或者能够读取数据的另一个事务未提交前的原始值,那么必须对原始数据进行保存或者对更新操作进行保存,这样才能够查询到原始值。...InnoDB的二级索引带来的好处就是减少了由于数据移动或者数据页分列导致行数据的地址变了而带来的维护二级索引的性能开销,因为InnoDB的二级索引不需要更新行指针: ? 12.什么是回表?...首先要解决死锁问题,在程序的设计上,当发现程序有高并发的访问某一个表时,尽量对该表的执行操作串行化,或者锁升级,一次性获取所有的锁资源。...(1) 如果一个表的每条记录的内容很大,那么就需要更多的IO操作,如果字段值比较大,而使用频率相对比较低,可以将大字段移到另一张表中,当查询不查大字段的时候,这样就减少了I/O操作 (2)如果表的数据量非常非常大...水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点。

    79120

    mysql 系列:搞定索引

    数据库是用来存储与读取数据的,如何在这庞大的数据中查询我们想要的那一行呢?最简单的办法便是扫描整个数据表,一一对比。然而这样效率太低了。...一般的,我们往表里插入某一行数据时,总会有额外的信息来定位到这一行。这个信息可能是一个指针地址,也可能是一个主键标识。 在拿到这一行的定位信息后,就可以将列数据和定位信息做关联了。...并且它的排序直接对应了物理存储顺序。 非聚集索引:该索引除了存储索引信息还存储了定位到数据记录的信息,需要根据这个信息再做一次查询,才能获取到数据,并且它的排序是逻辑上,不是物理存储顺序。...主键:唯一地标识表中一条记录的索引,不能有 NULL 值。在 InnoDB 里,主键就是聚集索引。 唯一索引:索引所对应的列值里是不能有重复值的,允许有 NULL 值。...主要是为了找到索引后,不需要再去行数据里捞数据,直接从索引里提取字段信息即可。 普通单列索引:没有什么限制条件的索引列。 索引的缺点 引入索引,并不总意味着高效,它是需要付出代价维护的。

    86900
    领券