1、索引的底层实现原理和优化

B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。

3、什么情况下设置了索引但无法使用

  • 以“%”开头的LIKE语句,模糊匹配
  • OR语句前后没有同时使用索引
  • 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

4、简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说, 唯一索引可以保证数据记录的唯一性。

主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

5、 对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:

a)、索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度

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

加速表和表之间的连接

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

b)、索引对数据库系统的负面影响是什么?

负面影响:

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

c)、为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。

在频繁使用的、需要排序的字段上建立索引

d)、 什么情况下不宜建立索引?

对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等

6、你怎么看到为表格定义的所有索引?

索引是通过以下方式为表格定义的:

SHOW INDEX FROM <tablename>;

7、实现索引的方式? 索引的原理? 索引的代价? 索引的类型?

实现索引的方式有两种:针对一张表的某些字段创建具体的索引,如对oracle: create index 索引名称 on 表名(字段名);在创建表时为字段建立主键约束或者唯一约束,系统将自动为其建立索引。

索引的原理:根据建立索引的字段建立索引表,存放字段值以及对应记录的物理地址,从而在搜索的时候根据字段值搜索索引表的到物理地址直接访问记录。

引入索引虽然提高了查询速度,但本身占用一定的系统存储容量和系统处理时间,需要根据实际情况进行具体的分析.

索引的类型有:B树索引,位图索引,函数索引等。

8、聚簇索引和普通索引在不同的SQL语句中哪个效率更高?(聚簇索引和普通索引的区别)

概念类:

聚合函数? Session的定义和用法? Oracle的存储过程 ? 什么是构造函数?

9、怎样创建一个一个索引,索引使用的原则,有什么优点和缺点

创建标准索引: CREATE  INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名;

创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名;

创建组合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2)  TABLESPACE 表空间名;

创建反向键索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;

索引使用原则:

索引字段建议建立NOT NULL约束

经常与其他表进行连接的表,在连接字段上应该建立索引;

经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;

可选择性高的关键字 ,应该建立索引;

可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率

复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;

B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;

C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

频繁DML的表,不要建立太多的索引;

不要将那些频繁修改的列作为索引列;

索引的优缺点:

有点:

1. 创建唯一性索引,保证数据库表中每一行数据的唯一性

2. 大大加快数据的检索速度,这也是创建索引的最主要的原因

3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

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

缺点:

1. 索引创建在表上,不能创建在视图上

2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

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

10、索引的实现方式

都是 B+树索引, Innodb 是索引组织表, myisam 是堆表, 索引组织表和堆表的区别要熟悉

11、Oracle索引分为哪几类,说出唯一索引和位图索引的概念。

Oracle索引有B树索引,位图索引,函数索引,簇索引等。

唯一索引也是B树索引的一种,它要求被索引的字段值不可以重复。在创建的时候使用B树算法创建。

位图索引并不是采用象唯一索引那样存储(索引字段值,记录ROWID)来创建索引段的,而是为每一个唯一的字段值创建一个位图,位图中使用位元来对应一个记录的ROWID。位元到ROWID是通过映射的到的。

12、如何写 sql 能够有效的使用到复合索引。

由于复合索引的组合索引,类似多个木板拼接在一起,如果中间断了就无法用了,所以要能用到复合索引,首先开头(第一列)要用上,比如index(a,b) 这种,我们可以select table tname where a=XX 用到第一列索引 如果想用第二列 可以 and b=XX 或者and b like‘TTT%’

13、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果

14、数据库索引的实现(B+树介绍、和B树、R树区别)

http://blog.csdn.net/kennyrose/article/details/7532032

http://www.xuebuyuan.com/2216918.html

15、索引的使用注意事项

https://www.cnblogs.com/zlingh/p/3883716.html

16、MYsql 的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

索引是通过复杂的算法,提高数据查询性能的手段。从磁盘io到内存io的转变

普通索引,主键,唯一,单列/多列索引建索引的几大原则

1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

http://tech.meituan.com/mysql-index.html

http://www.cnblogs.com/cq-home/p/3482101.html

17、聚集索引和非聚集索引的区别。

“聚簇”就是索引和记录紧密在一起。

非聚簇索引 索引文件和数据文件分开存放,索引文件的叶子页只保存了主键值,要定位记录还要去查找相应的数据块。

18、数据库中 BTREE 和 B+tree 区别。

B+是btree的变种,本质都是btree,btree+与B-Tree相比,B+Tree有以下不同点:

每个节点的指针上限为2d而不是2d+1。

内节点不存储data,只存储key;叶子节点不存储指针。

http://lcbk.net/9602.html

Btree 怎么分裂的,什么时候分裂,为什么是平衡的。

Key 超过1024才分裂B树为甚会分裂? 因为随着数据的增多,一个结点的key满了,为了保持B树的特性,就会产生分裂,就向红黑树和AVL树为了保持树的性质需要进行旋转一样!

数据库索引相关面试题相关推荐

  1. 一文整理14道MySQL索引相关面试题

    精心整理14道MySQL索引相关面试题(珍藏版) 如果仅仅是死记硬背MySQL索引相关面试题一定是相当枯燥的,不容易记却容易忘,这里循序渐进的讲解有关索引有关知识点,让大家在理解的基础上记住一些面试常 ...

  2. 聚集索引和非聚集索引的区别底层_数据库-索引相关

    一.什么是索引 在数据库中,索引的含义与日常意义上的"索引"一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象. 总而言之,索引是一个排序的列表,在 ...

  3. 数据库索引高频面试题:2021中级Java开发面试解答,上岸蚂蚁金服!

    前言 Dubbo用起来就和EJB.WebService差不多,调用一个远程的服务(或者JavaBean)的时候在本地有一个接口,就像调用本地的方法一样去调用,它底层帮你实现好你的方法参数传输和远程服务 ...

  4. 数据库索引高频面试题(最新版)

    MySQL的索引是面试中的高频题目,将常见的索引面试题目总结了一下,如果有帮到你可以点赞收藏呦. 微信搜索公众号路人zhang,回复面试手册,领取更多高频面试题PDF版及更多面试资料. 面试手册在线版 ...

  5. 数据库索引高频面试题:传智播客java基础入门第二版答案

    在校生 如果你是在校生,你应该趁着在学校的时间夯实基础(比如计算机系统.算法.编译原理等等)不要动不动去搞什么项目,你也搞不出一个让面试官很满意的项目出来,所以根本没必要在项目上面浪费太多的时间. 如 ...

  6. 数据库索引相关(主键索引和非主键索引区别)

    索引基础 关于索引的知识可以看:SQL索引(INDEX). 简单概括就是:为数据库某些字段增加索引是可以加快查询速度的,并且一个表是可以创建多个索引的,而一个索引可以包含多个字段. 如果不使用索引,则 ...

  7. mysql索引相关面试题

    mysql桶 存储引擎分类有哪些以及使用场景? 创建索引的原则? 索引失效情况? ==校验SQL语句是否使用了索引方式为:在SQL语句前面使用explain关键字== 索引分类? linux添加索引 ...

  8. 数据库索引高频面试题:java判断文件编码

    二.面试题 面:考你几个红黑树的知识点

  9. MySQL索引分析以及相关面试题

    可以在我的个人博客阅读文章,排版会美观一些:文章地址 1. 什么是索引 一种能帮助mysql提高查询效率的数据结构:索引数据结构 索引优点: 大大提高数据查询速度 索引缺点: 维护索引需要耗费数据库资 ...

最新文章

  1. 爬虫入门的基本原理,如果你连这些都不知道那你可以放弃爬虫了
  2. 算法入门经典-第七章 例题7-2-2 可重集的排列
  3. Leetcode 226. 翻转二叉树 (每日一题 20210819)
  4. unity, Transform.TransformPoint(...)
  5. 关于计算机软件系统的知识,二、计算机软件系统基本知识
  6. ODB——基于c++的ORM映射框架尝试(安装)
  7. Git 存储原理及相关实现
  8. Double.valueOf()与Double.parseDouble()两者的区别
  9. NSURLConnection 下载数据 -- IOS(实例)
  10. CTSC2017APIO2017
  11. 苹果上新了!新款iPad Pro发布:妙控键盘成最大惊喜
  12. 从零开始学前端:表单制作 --- 今天你学习了吗?(CSS:Day05)
  13. Android源码之路(二、AsyncTask)
  14. visio 图标_visio有效提升工作效率
  15. resin session共享 redis_Spring Boot 利用Redis实现session共享
  16. 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等
  17. linux 输入法成繁体字_寻找Ubuntu中繁体字输入法 | 学步园
  18. saas系统和传统服务器的区别,传统CRM与SaaS模式的区别
  19. Unity3D自带案例AngryBots分析(二)——人物动作控制逻辑
  20. tkinter模块 视窗设计相关操作

热门文章

  1. windows server 2008 安装live mail
  2. 【编程练习题】实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理。
  3. 数据通信--ASCII码通信16进制通信的区别
  4. jenkin 发布失败 没有日志
  5. 百度语音转换技术,让失聪人和盲人独立对话成为可能!
  6. 【恒指早盘分析】投资从学会区分能力和运气开始
  7. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
  8. 高斯混合算法(GMM)与最大期望算法(EM)的推导
  9. mysql 删除一个字段语句怎么写_删除的sql语句怎么写
  10. C - Aladdin and the Flying Carpet(数论结论+思维)