精华内容
下载资源
问答
  • //建索引 INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);//插入 INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入视图实际影响表 UPDATE tablename SET name=’zang 3’...

    1. 数据抽象:物理抽象、概念抽象、视图级抽象,内模式、模式、外模式

    2. SQL语言包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control)

    数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

    数据操纵:Select ,insert,update,delete,

    数据控制:grant,revoke

    3. SQL常用命令:

    CREATE TABLE Student(

    ID NUMBER PRIMARY KEY,

    NAME VARCHAR2(50) NOT NULL);//建表

    CREATE VIEW view_name AS

    Select * FROM Table_name;//建视图

    Create UNIQUE INDEX index_name ON TableName(col_name);//建索引

    INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);//插入

    INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入视图实际影响表

    UPDATE tablename SET name=’zang 3’ condition;//更新数据

    DELETE FROM Tablename WHERE condition;//删除

    GRANT (Select,delete,…) ON (对象) TO USER_NAME [WITH GRANT OPTION];//授权

    REVOKE (权限表) ON(对象) FROM USER_NAME [WITH REVOKE OPTION] //撤权

    列出工作人员及其领导的名字:

    Select E.NAME, S.NAME FROM EMPLOYEE E S

    WHERE E.SUPERName=S.Name

    4. 视图:

    5. 完整性约束:实体完整性、参照完整性、用户定义完整性

    6. 第三范式:

    1NF:每个属性是不可分的。 2NF:若关系R是1NF,且每个非主属性都完全函数依赖于R的键。例SLC(SID#, CourceID#, SNAME,Grade),则不是2NF; 3NF:若R是2NF,且它的任何非键属性都不传递依赖于任何候选键。

    7. ER(实体/联系)模型

    8. 索引作用

    9. 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。事务性质:原子性、

     原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。

     一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

     隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

     持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

    10. 锁:共享锁、互斥锁

    两段锁协议:阶段1:加锁阶段 阶段2:解锁阶段

    11. 死锁及处理:事务循环等待数据锁,则会死锁。

    死锁处理:预防死锁协议,死锁恢复机制

    12. 存储过程:存储过程就是编译好了的一些sql语句。

    1.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。

    2. 可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

    3.可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。

    4:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因

    5:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。

    13. 触发器: 当满足触发器条件,则系统自动执行触发器的触发体。

    触发时间:有before,after.触发事件:有insert,update,delete三种。触发类型:有行触发、语句触发

    14.内联接,外联接区别?

    内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。

    在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种

    展开全文
  • 数据库索引高频面试题(最新版)

    千次阅读 2020-12-29 12:18:11
    MySQL的索引是面试中的高频题目,将常见的索引面试题目总结了一下,如果有帮到你可以点赞收藏呦。 文章目录索引什么是索引?索引的优缺点?索引的数据结构?Hash索引和B+树的区别?索引的类型有哪些?索引的种类有...

    MySQL的索引是面试中的高频题目,将常见的索引面试题目总结了一下,如果有帮到你可以点赞收藏呦。

    微信搜索公众号路人zhang,回复面试手册,领取更多高频面试题PDF版及更多面试资料。

    推荐阅读:

    索引

    什么是索引?

    百度百科的解释:索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。

    索引的优缺点?

    优点:

    • 大大加快数据检索的速度。
    • 将随机I/O变成顺序I/O(因为B+树的叶子节点是连接在一起的)
    • 加速表与表之间的连接

    缺点:

    • 从空间角度考虑,建立索引需要占用物理空间
    • 从时间角度 考虑,创建和维护索引都需要花费时间,例如对数据进行增删改的时候都需要维护索引。

    索引的数据结构?

    索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。

    • B+树索引

      熟悉数据结构的同学都知道,B+树、平衡二叉树、红黑树都是经典的数据结构。在B+树中,所有的记录节点都是按照键值大小的顺序放在叶子节点上,如下图。

    在这里插入图片描述

    从上图可以看出 ,因为B+树具有有序性,并且所有的数据都存放在叶子节点,所以查找的效率非常高,并且支持排序和范围查找。

    B+树的索引又可以分为主索引和辅助索引。其中主索引为聚簇索引,辅助索引为非聚簇索引。聚簇索引是以主键作为B+ 树索引的键值所构成的B+树索引,聚簇索引的叶子节点存储着完整的数据记录;非聚簇索引是以非主键的列作为B+树索引的键值所构成的B+树索引,非聚簇索引的叶子节点存储着主键值。所以使用非聚簇索引进行查询时,会先找到主键值,然后到根据聚簇索引找到主键对应的数据域。上图中叶子节点存储的是数据记录,为聚簇索引的结构图,非聚簇索引的结构图如下:

    在这里插入图片描述

    上图中的字母为数据的非主键的列值,假设要查询该列值为B的信息,则需先找到主键7,在到聚簇索引中查询主键7所对应的数据域。

    • 哈希索引

      哈希索引是基于哈希表实现的,对于每一行数据,存储引擎会对索引列通过哈希算法进行哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据行的指针作为哈希表的value值。这样查找一个数据的时间复杂度就是o(1),一般多用于精确查找。

    Hash索引和B+树的区别?

    因为两者数据结构上的差异导致它们的使用场景也不同,哈希索引一般多用于精确的等值查找,B+索引则多用于除了精确的等值查找外的其他查找。在大多数情况下,会选择使用B+树索引。

    • 哈希索引不支持排序,因为哈希表是无序的。
    • 哈希索引不支持范围查找。
    • 哈希索引不支持模糊查询及多列索引的最左前缀匹配。
    • 因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B+树索引的性能是相对稳定的,每次查询都是从根节点到叶子节点

    索引的类型有哪些?

    MySQL主要的索引类型主要有FULLTEXT,HASH,BTREE,RTREE。

    • FULLTEXT

      FULLTEXT即全文索引,MyISAM存储引擎和InnoDB存储引擎在MySQL5.6.4以上版本支持全文索引,一般用于查找文本中的关键字,而不是直接比较是否相等,多在CHAR,VARCHAR,TAXT等数据类型上创建全文索引。全文索引主要是用来解决WHERE name LIKE "%zhang%"等针对文本的模糊查询效率低的问题。

    • HASH

      HASH即哈希索引,哈希索引多用于等值查询,时间复杂夫为o(1),效率非常高,但不支持排序、范围查询及模糊查询等。

    • BTREE

      BTREE即B+树索引,INnoDB存储引擎默认的索引,支持排序、分组、范围查询、模糊查询等,并且性能稳定。

    • RTREE

      RTREE即空间数据索引,多用于地理数据的存储,相比于其他索引,空间数据索引的优势在于范围查找

    索引的种类有哪些?

    • 主键索引:数据列不允许重复,不能为NULL,一个表只能有一个主键索引
    • 组合索引:由多个列值组成的索引。
    • 唯一索引:数据列不允许重复,可以为NULL,索引列的值必须唯一的,如果是组合索引,则列值的组合必须唯一。
    • 全文索引:对文本的内容进行搜索。
    • 普通索引:基本的索引类型,可以为NULL

    B树和B+树的区别?

    B树和B+树最主要的区别主要有两点:

    • B树中的内部节点和叶子节点均存放键和值,而B+树的内部节点只有键没有值,叶子节点存放所有的键和值。

    • B+树的叶子节点是通过相连在一起的,方便顺序检索。

      两者的结构图如下。

      在这里插入图片描述

      在这里插入图片描述

    数据库为什么使用B+树而不是B树?

    • B树适用于随机检索,而B+树适用于随机检索和顺序检索
    • B+树的空间利用率更高,因为B树每个节点要存储键和值,而B+树的内部节点只存储键,这样B+树的一个节点就可以存储更多的索引,从而使树的高度变低,减少了I/O次数,使得数据检索速度更快。
    • B+树的叶子节点都是连接在一起的,所以范围查找,顺序查找更加方便
    • B+树的性能更加稳定,因为在B+树中,每次查询都是从根节点到叶子节点,而在B树中,要查询的值可能不在叶子节点,在内部节点就已经找到。

    那在什么情况适合使用B树呢,因为B树的内部节点也可以存储值,所以可以把一些频繁访问的值放在距离根节点比较近的地方,这样就可以提高查询效率。综上所述,B+树的性能更加适合作为数据库的索引。

    什么是聚簇索引,什么是非聚簇索引?

    聚簇索引和非聚簇索引最主要的区别是数据和索引是否分开存储

    • 聚簇索引:将数据和索引放到一起存储,索引结构的叶子节点保留了数据行。
    • 非聚簇索引:将数据进和索引分开存储,索引叶子节点存储的是指向数据行的地址。

    在InnoDB存储引擎中,默认的索引为B+树索引,利用主键创建的索引为主索引,也是聚簇索引,在主索引之上创建的索引为辅助索引,也是非聚簇索引。为什么说辅助索引是在主索引之上创建的呢,因为辅助索引中的叶子节点存储的是主键。

    在MyISAM存储引擎中,默认的索引也是B+树索引,但主索引和辅助索引都是非聚簇索引,也就是说索引结构的叶子节点存储的都是一个指向数据行的地址。并且使用辅助索引检索无需访问主键的索引。

    可以从非常经典的两张图看看它们的区别(图片来源于网络):

    在这里插入图片描述

    在这里插入图片描述

    非聚簇索引一定会进行回表查询吗?

    上面是说了非聚簇索引的叶子节点存储的是主键,也就是说要先通过非聚簇索引找到主键,再通过聚簇索引找到主键所对应的数据,后面这个再通过聚簇索引找到主键对应的数据的过程就是回表查询,那么非聚簇索引就一定会进行回表查询吗?

    答案是不一定的,这里涉及到一个索引覆盖的问题,如果查询的数据再辅助索引上完全能获取到便不需要回表查询。例如有一张表存储着个人信息包括id、name、age等字段。假设聚簇索引是以ID为键值构建的索引,非聚簇索引是以name为键值构建的索引,select id,name from user where name = 'zhangsan';这个查询便不需要进行回表查询因为,通过非聚簇索引已经能全部检索出数据,这就是索引覆盖的情况。如果查询语句是这样,select id,name,age from user where name = 'zhangsan';则需要进行回表查询,因为通过非聚簇索引不能检索出age的值。那应该如何解决那呢?只需要将索引覆盖即可,建立age和name的联合索引再使用select id,name,age from user where name = 'zhangsan';进行查询即可。

    所以通过索引覆盖能解决非聚簇索引回表查询的问题。

    索引的使用场景有哪些?

    • 对于中大型表建立索引非常有效,对于非常小的表,一般全部表扫描速度更快些。
    • 对于超大型的表,建立和维护索引的代价也会变高,这时可以考虑分区技术。
    • 如何表的增删改非常多,而查询需求非常少的话,那就没有必要建立索引了,因为维护索引也是需要代价的。
    • 一般不会出现再where条件中的字段就没有必要建立索引了。
    • 多个字段经常被查询的话可以考虑联合索引。
    • 字段多且字段值没有重复的时候考虑唯一索引。
    • 字段多且有重复的时候考虑普通索引。

    索引的设计原则?

    • 最适合索引的列是在where后面出现的列或者连接句子中指定的列,而不是出现在SELECT关键字后面的选择列表中的列。
    • 索引列的基数越大,索引的效果越好,换句话说就是索引列的区分度越高,索引的效果越好。比如使用性别这种区分度很低的列作为索引,效果就会很差,因为列的基数最多也就是三种,大多不是男性就是女性。
    • 尽量使用短索引,对于较长的字符串进行索引时应该指定一个较短的前缀长度,因为较小的索引涉及到的磁盘I/O较少,并且索引高速缓存中的块可以容纳更多的键值,会使得查询速度更快。
    • 尽量利用最左前缀。
    • 不要过度索引,每个索引都需要额外的物理空间,维护也需要花费时间,所以索引不是越多越好。

    如何对索引进行优化?

    对索引的优化其实最关键的就是要符合索引的设计原则和应用场景,将不符合要求的索引优化成符合索引设计原则和应用场景的索引。

    除了索引的设计原则和应用场景那几点外,还可以从以下两方面考虑。

    • 在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,因为这样无法使用索引。例如select * from table_name where a + 1 = 2
    • 将区分度最高的索引放在前面
    • 尽量少使用select*

    索引的使用场景、索引的设计原则和如何对索引进行优化可以看成一个问题。

    如何创建/删除索引?

    创建索引:

    • 使用CREATE INDEX 语句

      CREATE INDEX index_name ON table_name (column_list);

    • 在CREATE TABLE时创建

      	CREATE TABLE user(
      	id INT PRIMARY KEY,
      	information text,
      	FULLTEXT KEY (information)
      );
      
    • 使用ALTER TABLE创建索引

      ALTER TABLE table_name ADD INDEX index_name (column_list);

    删除索引:

    • 删除主键索引

      alter table 表名 drop primary key

    • 删除其他索引

      alter table 表名 drop key 索引名

    使用索引查询时性能一定会提升吗?

    不一定,前面在索引的使用场景和索引的设计原则中已经提到了如何合理地使用索引,因为创建和维护索引需要花费空间和时间上的代价,如果不合理地使用索引反而会使查询性能下降。

    什么是前缀索引?

    前缀索引是指对文本或者字符串的前几个字符建立索引,这样索引的长度更短,查询速度更快。

    使用场景:前缀的区分度比较高的情况下。

    建立前缀索引的方式

    ALTER TABLE table_name ADD KEY(column_name(prefix_length));

    这里面有个prefix_length参数很难确定,这个参数就是前缀长度的意思。通常可以使用以下方法进行确定,先计算全列的区分度

    SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM table_name;

    然后在计算前缀长度为多少时和全列的区分度最相似。

    SELECT COUNT(DISTINCT LEFT(column_name, prefix_length)) / COUNT(*) FROM table_name;

    不断地调整prefix_length的值,直到和全列计算出区分度相近。

    什么是最左匹配原则?

    最左匹配原则:从最左边为起点开始连续匹配,遇到范围查询(<、>、between、like)会停止匹配。

    例如建立索引(a,b,c),大家可以猜测以下几种情况是否用到了索引。

    • 第一种

      select * from table_name where a = 1 and b = 2 and c = 3 
      select * from table_name where b = 2 and a = 1 and c = 3
      

      上面两次查询过程中所有值都用到了索引,where后面字段调换不会影响查询结果,因为MySQL中的优化器会自动优化查询顺序。

    • 第二种

      select * from table_name where a = 1
      select * from table_name where a = 1 and b = 2  
      select * from table_name where a = 1 and b = 2 and c = 3
      

      答案是三个查询语句都用到了索引,因为三个语句都是从最左开始匹配的。

    • 第三种

      select * from table_name where  b = 1 
      select * from table_name where  b = 1 and c = 2 
      

      答案是这两个查询语句都没有用到索引,因为不是从最左边开始匹配的

    • 第四种

      select * from table_name where a = 1 and c = 2 
      

      这个查询语句只有a列用到了索引,c列没有用到索引,因为中间跳过了b列,不是从最左开始连续匹配的。

    • 第五种

      select * from table_name where  a = 1 and b < 3 and c < 1
      

      这个查询中只有a列和b列使用到了索引,而c列没有使用索引,因为根据最左匹配查询原则,遇到范围查询会停止。

    • 第六种

      select * from table_name where a like 'ab%'; 
      select * from table_name where  a like '%ab'
      select * from table_name where  a like '%ab%'
      

      对于列为字符串的情况,只有前缀匹配可以使用索引,中缀匹配和后缀匹配只能进行全表扫描。

    索引在什么情况下会失效?

    在上面介绍了几种不符合最左匹配原则的情况会导致索引失效,除此之外,以下这几种情况也会导致索引失效。

    • 条件中有or,例如select * from table_name where a = 1 or b = 3
    • 在索引上进行计算会导致索引失效,例如select * from table_name where a + 1 = 2
    • 在索引的类型上进行数据类型的隐形转换,会导致索引失效,例如字符串一定要加引号,假设 select * from table_name where a = '1'会使用到索引,如果写成select * from table_name where a = 1则会导致索引失效。
    • 在索引中使用函数会导致索引失效,例如select * from table_name where abs(a) = 1
    • 在使用like查询时以%开头会导致索引失效
    • 索引上使用!、=、<>进行判断时会导致索引失效,例如select * from table_name where a != 1
    • 索引字段上使用 is null/is not null判断时会导致索引失效,例如select * from table_name where a is null
    展开全文
  • 作者:从菜鸟到老菜鸟来源:简书Java常见面试题汇总-----------数据库(数据库索引及其实现)-1.jpg (78.54 KB, 下载次数: 0)2021-1-2 03:12 上传54、数据库索引索引的优缺点优点:1、大大加快数据的检索速度;...

    作者:从菜鸟到老菜鸟

    来源:简书

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-1.jpg (78.54 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    54、数据库索引

    索引的优缺点

    优点:

    1、大大加快数据的检索速度;

    2、创建唯一性索引,保证数据库表中每一行数据的唯一性;

    3、加速表和表之间的连接;

    4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

    缺点:

    1、索引需要占物理空间;

    2、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低数据的维护速度。

    索引的分类

    1、唯一索引: 是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

    2、非唯一索引:是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

    3、主键索引(主索引): 是唯一索引的特定类型。表中创建主键时自动创建的索引,一个表只能建立一个主索引。

    4、聚集索引(聚簇索引、Innodb):表中记录的物理顺序与键值的索引顺序相同。 因为真实数据的物理顺序只有一种,所以一个表只能有一个聚集索引。叶子节点(B+树)存储真实的数据行,不再有另外单独的数据页。

    5、非聚集索引(Mylsam):表中记录的物理顺序与键值的索引顺序不同。这也是非聚集索引与聚集索引的根本区别。叶子节点并非数据节点,而是每一个指向真正数据行的指针。

    聚集索引与非聚集索引的区别:

    1)、聚集索引的优缺点:优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引顺序的一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。

    建议使用聚集索引的场合为:A.某列包含了小数目的不同值。B.排序和范围查找。

    2)、聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点依旧是索引节点。

    3)、非聚集索引添加记录时,不会引起数据顺序的重组。

    看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次 B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

    1)、由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键 Id 来组织数据,获得数据更快。

    2)、辅助索引使用主键作为"指针",而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时,辅助索引的维护工作,InnoDB 在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置会随着数据库里数据的修改而发生变化,使用聚簇键索引就可以保证不管这个主键 B+ 树的节点如何变化,辅助索引树都不受影响。

    6、组合索引: 基于多个字段而创建的索引就称为组合索引,组合索引的使用要遵从最左前缀。在最左前缀原则中,范围查询会导致组合索引半生效,where子句有or出现还是会遍历全表。

    Mysql怎么增加一个索引

    创建索引:create index idx1 on table(col1, col2, col3);

    添加索引:alter table tablename add index indexname(col1, col2);

    55、数据库索引的实现

    目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构。B+Tree 是数据库系统实现索引的首选数据结构。

    在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。

    MyISAM 索引实现(非聚集索引)

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-2.jpg (40.42 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    图8是一个MyISAM表的主索引(Primary Key)示意,可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示:

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-3.jpg (36.74 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法会首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。

    InnoDB 索引实现(聚集索引)

    MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB 中,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶节点data 域保存了完整的数据记录(第一个重大区别)。 这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-4.jpg (25.47 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    上图是 InnoDB 主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集。

    1、InnoDB 要求表必须有主键(MyISAM 可以没有), 如果没有显式指定,则 MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。

    2、尽量在 InnoDB 上采用自增字段做表的主键。 因为 InnoDB 数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。

    这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。

    第二个与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录主键的值而不是地址。 换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。

    聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

    引申:为什么不建议使用过长的字段作为主键?因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

    总结

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-5.jpg (56.23 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    InnoDB使用的是聚簇索引,将主键组织到一棵 B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照 B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对 Name 列进行条件搜索,则需要两个步骤:第一步在辅助索引 B+树中检索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树中再执行一次 B+树检索操作,最终到达叶子节点即可获取整行数据。

    MyISAM 使用的是非聚簇索引,非聚簇索引的两棵 B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引 B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗 B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

    56、为什么使用B+树作为索引

    B/B+ 树性能分析

    1、n 个节点的平衡二叉树的高度为 H(即 logn),而 n 个节点的 B/B+树的高度为logt((n+1)/2)+1;

    2、若要作为内存中的查找表,B 树却不一定比平衡二叉树好,尤其当 m 较大时更是如此。因为查找操作 CPU 的时间在 B-树上是 O(mlogtn)=O(lgn(m/lgt)),而 m/lgt>1;所以 m较大时O(mlogtn)比平衡二叉树的操作时间大得多。因此在内存中使用B树必须取较小的m。(通常取最小值 m=3,此时 B-树中每个内部结点可以有 2 或 3 个孩子,这种 3 阶的 B-树称为 2-3 树)。

    为什么说 B+tree比 B 树更适合实际应用中操作系统的文件索引和数据索引。

    B+tree 的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对 B 树更小, 如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对 IO 读写次数就降低了。

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

    也有人认为数据库索引采用 B+树的主要原因是:B 树在提高了 IO 性能的同时并没有解决元素遍历的效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而 B树不支持这样的操作(或者说效率太低,需要中序遍历)。

    最后,我自己是一名从事了多年开发的JAVA老程序员,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:【交流】,即可免费获取。

    a3318c941136e31422f9e0be7c9e8802.gif

    Java常见面试题汇总-----------数据库(数据库索引及其实现)-6.jpg (22.04 KB, 下载次数: 0)

    2021-1-2 03:12 上传

    展开全文
  • 支付宝一面 介绍一下自己。 项目参与的核心设计有哪些 ...SQL优化,常用的索引? 还有什么问题需要问的。 02 支付宝二面 没有自我介绍,直接问做过哪些Java开发相关的项目。 对哪些技术比较熟悉

    支付宝一面

    1. 介绍一下自己。
    2. 项目参与的核心设计有哪些
    3. ArrayList和LinkedList底层
    4. HashMap及线程安全的ConcurrentHashMap,以及各自优劣势
    5. Java如何实现线程安全
    6. Synchronized和Lock哪个更好?
    7. HashMap中的get()方法是如何实现的?
    8. HashMap可以用在哪些场景?
    9. JVM,垃圾回收机制,内存划分等
    10. SQL优化,常用的索引?
    11. 还有什么问题需要问的。

    02 支付宝二面

    1. 没有自我介绍,直接问做过哪些Java开发相关的项目。
    2. 对哪些技术比较熟悉?
    3. 多线程状态图,状态如何流转?
    4. 死锁,死锁原因
    5. 页锁、乐观锁、悲观锁?
    6. 乐观锁如何保证线程安全?
    7. 用过线程池吗,对应的好处,如何用?
    8. 两个10G的文件,里面是一些url,内存只有1G,如何将这两个文件合并,找到相同的url?
    9. 1000个多并发线程,10台机器,每台机器4核的,设计线程池大小。
    10. 代码题:两个有序数组,数组中存在重复数字,合并成一个有序数组,去除重复数字。
    11. 说一下自己的优点。

    支付宝三面

    1. jvm性能调优都做了什么
    2. 数据库性能调优如何做
    3. 分布式系统原理:CAP,最终一致性,幂等操作等
    4. 高并发情况下,我们系统是如何支撑大量的请求的
    5. 集群如何同步会话状态
    6. 常用NOSQL,有做过比较?
    7. 什么情况会出现雪崩,以及如何应对?
    8. 负载均衡的原理
    9. 数据库事务属性
    10. 与同事沟通的时候,如果遇到冲突了如何解决?
    11. 工作中觉得哪方面欠缺?
    12. 有问题要问么?
    13. 期望薪水?
    14. 为什么要离开现在的公司?

    美团四面

    历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

    美团点评高级Java一面(技术,电话面试,约40分钟)

    1. 自我介绍。
    2. 项目介绍。
    3. 了解过redis源码及redis集群么?
    4. 分布式下redis如何保证线程安全?
    5. Hashmap的原理,源码?
    6. Hashmap增删的情况后端数据结构如何位移?
    7. hashmap容量为什么是2的幂次?
    8. object类你知道的方法?
    9. 你重写过hashcode和equals么,要注意什么?
    10. jvm内存分区,为什么要有新生代和老年代?
    11. 有做个JVM内存优化吗?
    12. 数据库索引 主键和唯一索引有什么区别?
    13. 聚集索引和非聚集索引的区别?
    14. MySQL存储引擎innoDB和MyISAM的区别?
    15. 讲一下稳定的排序算法和不稳定的排序算法?
    16. 讲一下快速排序的思想?

    美团点评高级Java二面**(技术,现场面试,约60分钟)**

    1. 几种线程池区别?
    2. aio,nio,bio的了解,NIO的核心概念有哪些?
    3. 常用的NIO框架有哪些,优劣势?
    4. 事务的四大隔离级别?
    5. jvm场景问题, 标记清除多次后老年代产生内存碎片,引起full gc,接下来可能发生什么问题?
    6. MySQL innodb的b+树索引,主键索引,聚簇索引有什么区别?
    7. 数据库四大特性?
    8. MySQL里有哪些锁,行锁表锁,乐观锁呢?
    9. MySQL的死锁怎么产生的,举了两个例子。
    10. dubbo里的zookeeper是做什么的?
    11. 表锁 行锁 乐观锁 悲观锁的特点和区别?
    12. 并发工具包有哪些,具体怎么用?
    13. Docker平时怎么使用的?
    14. Kafka如何解决数据堆积?
    15. kafka消息的存储机制?
    16. 如何用kafka保证消息的有序性?
    17. kafka如何保证并发情况下消息只被消费一次?

    美团点评高级Java三面题目**(技术,现场面试,约60分钟)**

    1. 项目介绍。
    2. 最有技术难度的项目,介绍下相关核心设计流程。
    3. 分布式下redis如何保证线程安全?
    4. redis持久化的方式以及区别?
    5. zookeeper如何实现分布式锁、其他分布式锁怎么实现?
    6. kafka的架构,如何用kafka保证消息的有序性?
    7. 数据库的优化包含哪些?MySQL的优化,谈两个你优化的例子。
    8. redis用的哪个版本?
    9. 如何搭建redis集群?
    10. redis如何主从同步?
    11. redis分布式锁注意事项?
    12. redis持久化的方式以及区别?
    13. redis持久化方式及区别?
    14. my sql数据量多大的时候需要分表?
    15. my sql常用的存储引擎及区别?
    16. zookeeper的作用:分布式锁、注册服务中心?
    17. zookeeper如何实现分布式锁、其他分布式锁怎么实现?
    18. 分布式事务的解决方案?
    19. 单点登录怎么实现?
    20. 秒杀系统怎么来实现?
    21. 工作中,遇见了技术瓶颈无法解决,你的解决思路?
    22. 技术选型方面,一个新技术和一个稳定的旧技术,你会如何选择,会考虑哪些因素?

    美团点评高级Java四面题目(HR,现场面试,约30分钟)

    1. 自我介绍下。
    2. 自己的优点和缺点。
    3. 为啥想来美团,对美团了解多少?
    4. 心中的互联网公司排序。
    5. 工作中遇见暂时无法解决的问题,你是怎么应对的?
    6. 最近在学什么新技术
    7. 你是通过什么路径与方法,去学习和接触一门新技术的?
    8. 未来的职业规划是什么?

    拼多多Java研发岗4面试经过及面试题

    历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

    一面

    1. 线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些
    2. 写一题算法,层次遍历树并输出每层的层级
    3. 写一道题,二叉树的后序遍历,非递归算法。
    4. 什么时候多线程会发生死锁,写一个例子
    5. 说一说jdk1.8中,对hashMap的优化,对concurrentHashMap的优化
    6. 如何解决hash冲突的,以及如果冲突了,怎么在hash表中找到目标值
    7. 有1000个数据存在hashmap中,实际的数量是多少,考虑负载因子和扩容
    8. 常见的RPC有哪些?对应的区别和性能比较?
    9. 操作系统的用户态和核心态切换条件以及为什么要切换
    10. 线程间的通信方式,异步队列,消息延迟获取

    二面

    1. MySQL的主从复制怎么做
    2. MySQL的索引,使用B+树索引的好处
    3. MySQL性能查看以及如何优化
    4. Redis是怎么做缓存的
    5. Redis的持久化操作
    6. 如何利用redis处理热点数据
    7. TCP三次握手的过程,如果没有第三次握手有什么问题。
    8. 分布式锁怎么实现

    三面

    1. cap了解么,分别指什么
    2. 网络编程nio和netty相关,netty的线程模型,零拷贝实现
    3. Redis是单线程还是多线程?Redis的分布式集群怎么做?
    4. 分布式消息队列有哪些(Kafka等)?有使用过哪些?具体应用在什么场景?
    5. 负载均衡怎么做的呢,为什么这么做,了解过集群雪崩么。
    6. 谈谈高并发场景下削峰,限流的实现?

    四面(HR)

    1. 为什么跳槽?
    2. 期望的薪资是多少?
    3. 如何看待加班问题?
    4. 平时自己是怎么学习技术的,除了Java相关,还会去了解其他什么技术?
    5. 未来几年有什么规划?

    最后

    权威指南-第一本Docker书

    引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

    总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

    image

    image

    image

    image

    关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

    如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南

    c4k-1626080109538)]

    关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

    如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南

    展开全文
  • java数据库面试题

    2021-02-15 17:14:11
    4. 索引 5. 查询缓存的使用 6. 什么是事务 7. 事务的四大特性 8. 并发事务带来哪些问题 9. 事务隔离级别有哪些?Mysql 的默认隔离级别是? 10. 锁机制与 InnoDB 锁算法 11. 大表优化 12. 解释一下什么是池化设计思想...
  • Java 基础高频面试题(2021年最新版)

    万次阅读 多人点赞 2021-03-31 23:39:26
    最新 Java 基础高频面试题
  • 阿里巴巴Java面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHashMap吧。 3.讲一下JVM虚拟机内存结构,以及它们的作...
  • Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。 Java中级面试永远是程序员...
  • 小伙伴们好,我是库森。 今天给大家带来了MySQL索引的常考面试题,看...这是本期的MySQL索引面试题目录,不会的快快查漏补缺~ 1. 索引是什么? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它
  • 什么是数据库事务?事务有什么特点?数据库事务:是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元。事务特点:原子性一致性隔离性持久性特2. 主键和外键的区别...
  • Java中高级面试题

    千次阅读 2021-03-06 21:21:13
    数据库相关(mysql): 1)msyql优化经验: 2)mysql的语句优化,使用什么工具; 3)mysql的索引分类:B+,hash;什么情况用什么索引; 4)mysql的存储引擎有哪些,区别是什么; 5)说说事务的特性和隔离级别; 6)...
  • 1.存储过程和函数的区别存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。...
  • 数据库试题阅读指南文章目录1.事务四大特性2.数据库隔离级别3.MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景4.索引有B+索引和hash索引5.聚集索引和非聚集索引6.索引的优缺点,什么时候使用索引,什么...
  • 那么现在准备得差不多或者压根还没准备但是又想进大厂的朋友,可以一起来看看我给大家整理的这些关于MySQL的经典面试题,你是否都能答得出来呢? 1、MySQL 中有哪几种锁? 1、表级锁:开销小,加锁快;不会出现死锁...
  • Java面试题——数据结构篇(持续更新中)2018-12-11 00:43:52卢浮宫版权声明:本文为站长原创文章,转载请写明出处 QQ分享一、前言承接上文,本篇为数据结构篇。就该部分试题做简要分析。二、正文开始1、介绍下...
  • 最近面试了几个实习生,感觉基础能力都不大行,数据库在程序员的面试中占有举足轻重的一个作用。今天我们来讲一讲数据库索引是什么? 索引,就跟我们的书本的目录一样,如果一本书没有目录,那么你要找某一个知识点...
  • Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归档模式(Archivelog-style),通常,...
  • java高级工程师面试题及答案解析

    万次阅读 2021-03-07 03:50:08
    面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。一、堆的年轻代和老年代怎么理解?堆的年轻代大则老年代小,GC...
  • 顺分面试题:你都用过哪些数据库数据库优化操作回答:1、根据服务层面配置mysql性能优化参数;2、从系统层面增强mysql的性能:优化数据表结构① 将字段较多的表分解成多个表对于字段较多的表,如果有些字段的使用...
  • 10万字208道Java经典面试题总结(附答案)

    万次阅读 多人点赞 2021-08-01 16:05:55
    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。...
  • Java面试总结(2021优化...【Java精选】专注程序员推送一些Java开发知识,包括基础知识、各大流行框架、大数据技术、数据库面试题、面试经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于
  • 今天为学习计算机编程的毕业生们准备了20道java oracle面试题附答案,希望能帮助到正在求职面试的朋友们。1.什么是存储过程,使用存储过程的好处?答:存储过程是一组为了完成特定功能的MySQL语句集,经编译后存储在...
  • 数据库索引有哪几种?为什么要用B+树来做索引?组合索引和几个单个的索引有什么区别?数据库的大表查询优化了解吗?MVCC机制了解不?MVCC机制有什么问题?怎么去解决这个问题?mysql慢语句调优做过吗?说说你是...
  • 对象依赖 3.AOP入门 4.JDBCTemplate和Spring事务 5.Spring事务原理 6.Spring事务的一个线程安全问题 7.IOC再回顾以及我常问的面试题 8.AOP再回顾 Spring源码学习总结(篇幅有限) Spring MVC Spring Boot Spring ...
  • 为什么 Java 中只有值传递? int 范围?float 范围? hashCode 与 equals,什么关系? String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? Java 序列化中如果有些字段不想进行...
  • Java中高级面试题整理

    2021-02-28 12:10:13
    数据库相关(mysql): 1)msyql优化经验: 2)mysql的语句优化,使用什么工具; 3)mysql的索引分类:B+,hash;什么情况用什么索引; 4)mysql的存储引擎有哪些,区别是什么; 5)说说事务的特性和隔离级别; 6)...
  • 1、为什么MySQL索引更适合B+树而不是二叉树、B树 https://blog.csdn.net/qq_38038480/article/details/81738079 2、微服务下的用户登录权限校验解决方案 https://www.cnblogs.com/zxfei/p/11716822.html 3、...
  • 阿里巴巴Java面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHashMap吧。 3.讲一下JVM虚拟机内存结构,以及它们的作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,486
精华内容 18,994
关键字:

java数据库索引面试题

java 订阅