索引:是为了提高数据查询的效率

常见模型:

  1. 哈希表(以键值对key-value存储数据的结构)
    1. 适应场景:哈希表这种结构适用于只有等值查询的场景
    2. 思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置
    3. 冲突的解决办法:链表
  2. 有序数组
    1. 有序数组索引只适用于静态存储引擎
    2. 按顺序存储。查询用二分法就可以快速查询
  3. 二叉搜索树
    1. 每个节点的左儿子小于父节点,父节点又小于右儿子
    2. 查询时间复杂度O(log(N)),更新时间复杂度O(log(N))
    3. 数据库存储大多不适用二叉树,因为树高过高,会适用N叉树

InnoDB 的索引模型:B+树(每一个表是好几棵B+树,B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数)

索引分为主键索引和非主键索引

  • 主键索引:叶子节点存的是整行数据,在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
  • 非主键索引:叶子节点存的是主键索引的值在InnoDB里,非主键索引也被称为二级索引(secondary index)。

基于主键索引和普通索引的查询有什么区别?

  如果语句是select * from T where ID=500,即主键查询方式,则只需要搜索ID这棵B+树;

  如果语句是select * from T where k=5,即普通索引查询方式,则需要先搜索k索引树,得到ID的值为500,再到ID索引树搜索一次。这个过程称为回表。(回到主键索引树搜索的过程,我们称为回表)

维护:

一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。

 select * from T where k between 3 and 5 
  1. 在k索引树上找到k=3的记录,取得 ID = 300;

  2. 再到ID索引树查到ID=300对应的R3;

  3. 在k索引树取下一个值k=5,取得ID=500;

  4. 再回到ID索引树查到ID=500对应的R4;

  5. 在k索引树取下一个值k=6,不满足条件,循环结束。

这个查询过程读了k索引树的3条记录(步骤1、3和5),回表了两次(步骤2和4)

覆盖索引:减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

select ID from T where k between 3 and 5
--只需要查询ID值,而id值已经在k索引树上了,所以不需要回表

面试官:你们项目都是用关系型数据库吗?

回答: 是的,我们线上使用的是mysql

  • 关系型:指基于“关系模型”的数据库,他的模型有1对多,多对多,多对1(msyql、oracle、sql server)
  • 非关系型:指基于“非关系模型”的数据库,他的模型有列模型(Hbase)、键值对模型(redis)、文档类模型(mangoDb)

面试官:那你们都是怎么做优化的?

回答:我们在数据库创建了一些索引

面试官:那你能说说是什么索引吗?

回答:索引是一种数据结构,能够很好的帮助我们检索数据库中的数据

面试官:那索引具体采用的那种数据结构呢?

回答:索引分为hash索引和tree索引,我们用的是innoDb,默认是b+树索引

面试官:b+树和hash索引有什么优缺点,为什么用b+树?

回答:

  hash索引底层是hash表,hash表是以key—value的形式存储的,所以多个数据在存储关系上没有任何顺序关系的,对于区间插件是无法通过索引查询的,就需要做全表扫描,而b+树是一种多路平衡树,他的节点是天然 有序的,(左节点小雨父节点,父节点小于右节点),所以对于范围查询的时候不需要做全表扫描

  hash索引适合等值查询,但是无法进行范围查询,哈希索引没办法利用索引排序,哈希索引不支持多列联合索引的最左匹配原则,如果有大量重复键值的情况下,哈希索引的效率会很低,

面试官:b+树的叶子节点可以存储哪些东西?

回答:存储的是整行数据或者主键的值

面试官:有什么区别

回答:存储整行数据的是主键索引,又称聚簇索引,存储主键的值是非聚簇索引

面试官:聚簇索引和非聚簇索引的区别?

回答:聚簇索引比非聚簇索引索引更快,因为主键索引树节点的数据就是我们要查询的数据,而非聚簇索引,的叶子结点是主键的值,需要再次回表,根据主键的值再去查询一次

面试官:所有的非聚簇索引都需要回表吗?

回答:覆盖索引除外(select id from table where a ='1')

面试官:创建索引考虑的因素有哪些?

回答:我们一般对于查询概率比较高的字段,经常座位where条件的字段设置索引

面试官:联合索引多个字段的顺序是怎么选择的

回答:识别度高的字段放前边,因为联合索引遵循最左匹配原则,既最左优先,假如有个联合索引abc,那么他就相当于有a,ab,abc三个索引,这就是最左匹配原则

面试官:有什么手段可以知道有没有走索引查询

回答:可以通过exolain查看sql语句的执行计划,通过执行计划来分析索引使用情况

面试官:那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢

回答:咱们在执行sql语句的时候,优化器会去计划这条sql的执行最优方案,既使用哪个索引

sql---索引总结的更多相关文章

  1. SQL索引学习-索引结构

    前一阵无意中和同事讨论过一个SQL相关的题(通过一个小问题来学习SQL关联查询),很惭愧一个非常简单的问题由于种种原因居然没有回答正确,数据库知识方面我算不上技术好,谈起SQL知识的学习我得益于200 ...

  2. SQL索引学习-聚集索引

    这篇接着我们的索引学习系列,这次主要来分享一些有关聚集索引的问题.上一篇SQL索引学习-索引结构主要是从一些基础概念上给大家分享了我的理解,没有实例,有朋友就提到了聚集索引的问题,这里列出来一下: 其 ...

  3. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  4. SQL索引一步到位

    以下均非原创,仅供分享.学习!!! SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? S ...

  5. {好文备份}SQL索引一步到位

    SQL索引一步到位(此文章为"数据库性能优化二:数据库表优化"附属文章之一)   SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百 ...

  6. 转载:SQL索引一步到位

    原文: http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文 ...

  7. SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

    SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭 ...

  8. SQL索引详解

    转自:http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可 ...

  9. 数据库性能优化一:SQL索引一步到位

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  10. paip.sql索引优化----join 代替子查询法

    paip.sql索引优化----join 代替子查询法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

随机推荐

  1. M1芯片pod问题

    M1芯片pod问题 换了M1芯片的mac后,在Xcode跑项目报pod错误,提示run pod install更新pod,但是去终端跑命令时又报错 然后在github上看到一个老哥的方法 https: ...

  2. 有邻App覆盖3000多个小区成杭州用户量最大的邻里分享经济平台 杨仁斌:开创新社区时代

    [浙商创业青云榜] 当下中国大多数的城市社区里,邻居这个词是个淡薄的概念. 2014年,一名阿里高管决心改变现状,辞职创业,深挖社区分享经济,准备用一款手机App"有邻",去敲开陌 ...

  3. 【杂谈】Kafka 消息偏移量:如何高效地定位和管理消息?

    前言 在 Kafka 中,消息偏移量是什么?是文件中的索引吗?又是如何通过偏移量快速定位消息的?本文将深入探讨这些问题,帮助你更好地理解 Kafka 的偏移量机制. Kafka 的偏移量是什么? Ka ...

  4. Qt音视频开发2-vlc回调处理

    一.前言 用句柄来显示视频,方便是很方便,但是有个缺点就是不能拿到实时视频的每张图片的数据,这个就比较讨厌,大部分的监控行业的应用,除了截图以外,很可能需要拿到图片自己做一些处理的,而且拿到图片自己绘 ...

  5. OpenWrt安装腾讯云DDNS插件

    1.插件介绍 OpenWRT TencentDDNS插件是一款腾讯云研发的,自动映射动态公网IP至用户指定的DNSPod域名解析记录的官方插件. 标题 名称 中文名称 腾讯云DDNS插件 英文名称 l ...

  6. [转]BeanUtils.copyProperties使用总结以及注意事项

    1.前言开发过程中,讲一个对象的属性和值赋值到另一个对象上,大量使用了get.set方法,看着很臃肿,思考下肯定不只有我有这种想法,所以技术上肯定有方法能解决这个问题,所以查阅了一些资料发现了Bean ...

  7. WorldWind源码剖析系列:漫游时四叉树瓦片类QuadTile的运行思路

    用户在窗口漫游时,需要加载精细的高程和纹理数据时的处理思路:当用户漫游时直到窗口相机的视场角的1/2小于(瓦片大小*瓦片绘制距离的乘积)时,才初始化四叉树瓦片类QuadTile,或者加载本地缓存中的数 ...

  8. Linux下获取文件名

    linux 下一切皆文件 1.获取指定路径下文件或目录 ls -la /usr/local/ |grep xxx | head -n 1 |awk '{print$9}'xxx : 替换为要匹配的文件 ...

  9. sql server导入表的一些函数使用

    truncate table JC_BMDA; insert into JC_BMDA(bh,mc,qdmc,pym,ty) select right('0'+rtrim(convert(varcha ...

  10. C# 深度学习框架 TorchSharp 原生训练模型和图像识别-手写数字识别

    目录 开始使用 Torch 准备 下载数据集 显示图片 加载数据集 定义网络 优化模型参数 训练模型 保存和加载模型 使用模型识别图片 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址:h ...