数据库索引有关的知识,说实在的,真的是很复杂,本来想好好看看这方面的东西,然后写篇文章详细谈谈的,后来发现索引的知识太难太深,要谈得全面又详细真的很难,所以最后还是把自己学到的和想到的变成下面一个个的问题,希望能对大家帮助!

知识点

问题1:什么是数据库索引?

数据库索引是数据库系统中一个重要的概念,索引也叫做 key ,是一种用于提升数据库查询效率的数据结构,我们可以把索引理解成一本书的目录,通过目录我们可以快速找到对应章节的内容,同样的,通过数据库索引,我们可以快速找到数据表中对应的记录。

总而言之,索引就像给数据表建了一个目录一样。

问题2:为什么在使用索引?

1 . 使用索引大大减少了存储引擎需要扫描的数据量,如果没有使用索引的话,每查询一行数据都要对数据表进行扫描,这样的话会非常慢。

2 . 由于索引已经排好序的,所以对数据表进行 ORDER BY 和 GROUP BY 等操作时,可以很快得到结果。

3 . 索引可以将随机的 I/O 转为顺序的 I/O ,避免高昂的磁盘 IO 成本,提升查询效率。

问题3:MySQL索引在哪个模块中实现的?

MySQL 的索引是在存储引擎这一层实现的,因此每一种存储引擎都有不同的实现方式,对同一种索引的处理方式也完成不同。

问题4:为什么设置了索引却不起作用?

如果使用以 % 开头的 LIKE 语句进行模糊匹配,则无法使用索引,如:

SELECT * FROM users WHERE name LIKE '%小张%';

SELECT* FROM users WHERE name LIKE '%小张';

复制代码

不过以 % 为结尾则可以使用索引,如:

SELECT * FROM users WHERE name LIKE '张%';

复制代码

OR 语句前后没有同时使用索引,比如下面的语句, 字段id 有索引,而 字段name 没有创建索引,那么下面的语句只能全表扫描,无法用到索引:

SELECT * FROM users id = 10 or name='test'复制代码

问题5:MySQL索引底层使用什么数据结构?

在 MySQL 中,大部分情况下,索引都是使用 B-Tree 作为底层数据结构, B-Tree 只是一种泛称,实际上不同的存储引擎使用 B-Tree 时,有不同的变种,比如 InnoDB 使用的是 B+Tree 。

另外也有一些特殊的索引结构,比如哈希索引,哈希索引底层则使用的是哈希表,在 MySQL中,只有 Memory 存储引擎支持哈希索引。

问题6:什么情况下数据表不适合创建索引?

1 . 对于用于存储归档历史数据的且很少用于查询的数据表,不建议创建索引。

2 . 数据量比较小的数据表,而且未来数据也不会有太大增长的数据,不应该建索引,比如用于保存配置的数据表。

3 . 修改频繁,且修改性能远大于查询性能时,不应该再创建索引。

问题7:什么是回表?

回表是对Innodb存储引擎而言的,在 InnoDB 存储引擎中,主键索引的叶子节点存储的记录的数据,而普通索引的叶子节点存储的主键索引的地点。

当我们通过主键查询时,只需要搜索主键索引的搜索树,直接可以得到记录的数据。

当我们通过普通索引进行查询时,通过搜索普通索引的搜索树得到主键的地址之后,还要再使用该主键对主键搜索树进行搜索,这个过程称为回表。

问题8:聚簇索引与非聚簇索引的区别?

聚簇索引:聚簇索引的顺序就是数据的物理存储顺序,并且索引与数据放在一块,通过索引可以直接获取数据,一个数据表中仅有一个聚簇索引。

非聚簇索引:索引顺序与数据物理排列顺序无关,索引文件与数据是分开存放。

问题9:MySQL主键索引、唯一索引与普通索引的区别?

设置为主键索引的字段不允许为 NULL ,而且一张数据表只能有一个主键索引。

设置为唯一索引的字段,其字段值不允许重要。

普通索引可以包含重复的值,也可以为 NULL 。

问题10:索引可以提高查询性能,那是不是索引创建越多越好?

索引作为一个数据表的目录,本身的存储就需要消耗很多的磁盘和内存存储空间。

并助在写入数据表数据时,每次都需要更新索引,所以索引越多,写入就越慢。

尤其是糟糕的索引,建得越多对数据库的性能影响越大。

问题11:MyISAM与InnoDB在处理索引上有什么不同?

MyISAM 存储引擎是非聚族索引,索引与数据是分开存储的,索引文件中记录了数据的指针

而 InnoDB 存储引擎是聚族索引,即索引跟数据是放在一块的, InnoDB 一般将主键与数据放在一块,如果没有主键,则将 unique key 作为主键,如果没有 unique key ,则自动创建一个 rowid 作为主键,其他二级索引叶子指针存储的是主键的位置。

问题12:什么是索引的最左前缀原则?

MySQL 数据库不单可以为单个数据列创建索引,也可以为多个数据列创建一个联合索引,比如:

CREATE TABLE test(

a INT NOT NOT,

b INT NOT NOT,

KEY(a,b)

);

复制代码

当我们使用下面的查询语句时,由于 WHERE 语句中查询的条件就是联合索引,所以可以很快查询到数据。

SELECT * FROM test WHERE a=1 AND b=1;

复制代码

同样,下面的语句也会利用上面创建的联合索引,这是因为 MySQL 会按照索引创建的顺序进行排序,然后根据查询条件从索引最左边开始检测查询条件是否满足该索引,由于字段 a 在最左边,所以满足索引。

SELECT * FROM test WHERE a=1;

复制代码

而使用 字段b 进行查询时,则为满足,因为从最左边匹配到的是 字段a ,所以 MySQL 判断为不满足索引条件。

SELECT * FROM test WHERE b=1;

复制代码

从上面例子可以很好地了解索引的最左前缀原则,同时也说明了索引顺序的重要性。

问题13:什么是覆盖索引?

如果一个索引中包含查询所要的字段时,此时不需要再回表查询,我们就称该索引为覆盖索引。

比如下面的查询中,字段id是主键索引,所以可以直接返回索引的值,显著提升了查询的性能。

SELECT id FROM users WHERE id BETWEEN 10 AND 20;

复制代码

小结

当然,上面列出的只是索引的一小部分知识点,有什么回答不对的地方,欢迎指出。

想要精彩内容,可以关注我的微信公众号:Java技术zhai,这是我的私人公众号,专注于Java技术分享,期待你的参与。

内容来源于网络如有侵权请私信删除

mysql qbe_掌握这13个MySQL索引知识点,让你面试通过率翻倍相关推荐

  1. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...

  2. mysql索引失效怎么办,跳槽薪资翻倍

    前言 说起MySQL优化的话,想必大部分人都不陌生了.在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*.避免使用NULL值的判断.根据需求适当的建立索引.优化MySQL参数-但是你对于 ...

  3. mysql 日期_「13」MySQL中与日期与时间相关的函数

    下面这张图片,是我们每个人拿起手机就应该看到的,这就是日期与时间! MySQL中如何通过各种函数来实现日期与时间的处理?这就是本文所要探索的问题! [1]获取当前日期的函数 [结论]返回值是以&quo ...

  4. 13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复

    扩展 : SQL语句教程 http://www.runoob.com/sql/sql-tutorial.html 什么是事务?事务的特性有哪些? http://blog.csdn.net/yenang ...

  5. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  6. MYSQL专题-由简到繁理解索引结构

    大家可能都听过数据库索引,当然作为开发者来说其实大部分时间也用过索引.但是可能有的人知道索引是干什么的,但是对于索引的结构却不是很了解.所以这篇博客我会谈谈对索引结构的一些知识以及分享如何从零开始一层 ...

  7. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  8. mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

    最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务.经过排查后,确定原因是:SQL在执行时,MySQL优化器选择了错误的索引(不应该说是"错误",而是选择了实际执行 ...

  9. MySql (4)-储存引擎、索引、锁、集群

    MySQL高级 一.MySQL存储引擎 1.MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连 ...

最新文章

  1. 打开某网站无法访问出现空白页可能的原因
  2. 您如何在PHP中解析和处理HTML / XML?
  3. PHP底层运行原理初探
  4. 如何使用代码区分service contract和service contract quotation
  5. python-函数的闭包
  6. 通过MFC窗口获取方向键
  7. android+查看内存容量apk,如何检查 Android 应用的内存使用情况
  8. Truthman or Fakeman 并查集
  9. SRL——无人机区域定位系统
  10. 如何在GitHub上搜索提交消息?
  11. 经纬度距离计算小工具_造价算量慢?70个造价史上最实用小工具和计算表格,速领...
  12. MCU芯片缺货涨价 国内厂商机遇和挑战并存
  13. 二十个JAVA程序代码
  14. unity引用类型序列化_Unity 序列化 总结
  15. php manual 下载,PHP - Manual手册 - Download下载
  16. 宝塔面板权限不足问题解决
  17. MATLAB绘制平方函数,MATLAB绘制由函数x^2/4+y^2/9+z^2/16=1形成的立体图,
  18. dataframe保存为txt_Python读写txt文本(示例说明)
  19. 找规律万能公式_求各种数学万能公式求一些万能公式,帮助各个喜欢数学的同学,求解方程、列方程、求根、列规律式等等,最好有较详细的用法和解释....
  20. C#爬虫,让你不再觉得神秘

热门文章

  1. Bat脚本实现定时演示PPT后自动关闭PPT
  2. 3、中小企业网络架构-接入层交换机基本配置
  3. 微型计算机标致寄存器实验报告,xin微机原理与汇编语言程序设计
  4. 用Java模拟微信红包的实现
  5. 用命令行编译java文件
  6. MIRO BAPI_INCOMINGINVOICE_CREATE1 报错 MRM_INVOICE_TAXES_SAVE
  7. ArcGIS教程:“格网和经纬网向导”快速浏览
  8. 微信公众号开发9连接数据库
  9. Python收取163邮箱--Star.hou
  10. matlab和r语言做热图,案例演示 | R语言绘制热图代码