返回顶部
首页 > 资讯 > 数据库 >mysql 索引十连问| 剑指 offer - mysql
  • 521
分享到

mysql 索引十连问| 剑指 offer - mysql

mysql索引十连问|剑指offer-mysql 2015-10-12 09:10:37 521人浏览 才女
摘要

以下是结合网上及此前面试时遇到的一些关于Mysql索引的面试题。 若对mysql索引不太了解可先翻阅相关文章 大白话 mysql 之深入浅出索引原理 - 上 大白话 mysql 之深入浅出索引原理 - 下 什么是索引? 索引类似书本的

mysql 索引十连问| 剑指 offer - mysql

以下是结合网上及此前面试时遇到的一些关于Mysql索引面试题
若对mysql索引不太了解可先翻阅相关文章

  • 大白话 mysql 之深入浅出索引原理 - 上
  • 大白话 mysql 之深入浅出索引原理 - 下

什么是索引?

索引类似书本的目录,查询书中的指定内容时,先在目录上查找,之后可快速定位到内容位置。在数据库中通常通过B树/B+树数据结构实现。

主键索引和非主键索引有什么区别?

主键索引树中叶子节点存储的是整行数据,而非主键索引叶子节点上保存的是主键的值。使用非主键索引时,先从非主键索引获取到行对应主键ID,之后再根据id在主键索引树上搜索对应行数据,这个过程也被称为回表。

一般使用什么字段作为主键,为什么?

一般使用innodb的自增整数类型作为主键:

  • 因为自增,容易保证主键索引的有序性,同时还能避免新数据中间位置插入时导致的页分裂;
  • 二级索引叶子节点上保存的是主键值,整数类型主键长度较小,二级索引树占用的空间较小。

索引使用场景

where

为查询条件字段创建索引,以达到快速过滤指定条件数据的目的。

order by

当使用order by将查询结果按某个字段排序时,可考虑为该字段创建索引。没有索引时,会先将查询结果放到内存中进行排序(若内存空间不足,会利用磁盘辅助排序),比较影响查询效率。
索引本身是有序的,可以直接按索引的顺序逐条回表取出数据即可。如果是分页查询,效果更好,这时候只需要取出某个范围的索引对应的数据,而不需要取出所有满足条件的数据排序后再截取返回分页数据。

join

使用join时,为被驱动表的关联字段创建索引,可以有效提高查询效率。比如select * from t1 straight_join t2 on (t1.a=t2.a) where t1.b = "xxxx"; t2的字段a上有索引,查询过程会是先从表1中依次取出满足条件的行数据,之后用行数据中的a字段去t2上匹配后将两表字段拼接返回,此时能使用到t2.a的索引,避免了t2全表扫描。

索引覆盖

如果select字段+where字段字段列数不太多且查询频繁时,可以考虑为select和where字段创建联合索引,避免查询时回表,提高查询效率。比如select a from t where b = ‘xx’, 创建联合索引(b, a), 此时扫描索引树后,就已经得到需要查询的字段a了,不需要再回表。需要注意的是联合索引字段的顺序,这个语句无法使用到索引(a, b)。

创建索引需要注意的地方

  • 最左前缀匹配原则,联合索引需要注意索引字段的顺序,mysql 会一直向右匹配直到遇到范围查询 (>、<、between、like) 就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 ,如果建立 (a,b,c,d) 顺序的索引,d 是用不到索引的。
    字段是否用到索引的意思是字段是否能利用字段在索引中的有序性进行快速过滤。索引(a,b,c,d), 在索引树上是先按a进行排序,再按b进行排序,以此类推,排序规则类似order by a,b,c,d。上面查询条件中,a定值,b是有序的;b定值,c是有序的;c范围查询,剩下的d是无序的。所以d无法使用到该索引。

  • 基数小,区分度低的不适合创建索引。比如性别,最多基数最多总共就3个,此时索引过滤性能不高,查完索引后还需回表,可能比直接全表扫描效率更低。

  • 更新频繁的字段创建索引时要权衡索引维护成本。

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

  • 避免对text大字段创建索引,会导致索引树太大,查询效率不高。如果大字段前n个字符区分度较高,可以考虑创建前缀索引,只索引开始的部分字符,这样可以节约索引空间,提高索引效率。其缺点是不能用于ORDER BY和GROUP BY操作,也不能用于覆盖索引(因为前缀索引树上只有字段的部分内容,需要进行回表)。

什么时候索引会失效?

  • 模糊查询时查询条件以”%”开头无法使用到索引

  • 使用or查询时,只有当所有的查询条件字段都有索引才能使用到,比如a=1 or b = 2,只有当a和b都有索引才能使用到索引。

  • 数据类型出现隐式转换,如varchar不加单引号的时候可能会自动转换为int类型,这个时候索引失效。

  • 在索引列上使用IS NULL或者 IS NOT NULL 时候,索引失效,因为索引不会索引空值。

  • 在索引字段上使用”NOT、 <>、!=、NOT IN “时是不会使用索引的,这时只会进行全表扫描。

  • 对索引字段进行计算操作,函数操作时不会使用索引。

  • 优化器觉得全表扫描速度比索引速度快的时候不会使用索引。一般出现在全表数据比较少的情况下,这时全表扫描比在非主键索引上查找后再回表速度可能更快。

  • 联合索引时,查找不满足最左匹配规则,无法使用到联合索引。

innodb使用b+树作为索引模型的原因

Mysql设计的使用场景比较广泛,需要对遍历查询、单条查询、数据更新都需要较好的性能支持。B+树的特性是只在叶子节点上存储数据。可以从数据读写方面与哈希表、有序数组、b树其他几种索引模型进行比较:

  • 哈希表:哈希表只能进行等值查询,在处理范围查询和排序查询时,需要全表扫描哈希表。
  • 有序数组:有序数组在进行数据更新时成本较大。往数组中间位置添加数据时,需要移动后面的数据位置。
  • B树:b树在非叶子节点上也存储数据,在遍历数据时,需要对不同层级的节点上的数据进行拼接和排序,这会导致多次磁盘io。查询效率较低。

如何删除百万级别或以上的数据?

可以考虑先删掉表的索引,等删除数据后再重建索引。当我们在进行数据修改时,需要同时修改索引,这些额外的索引维护成本较低数据修改的效率;同时,大量的数据删除会导致索引数据页产生大量的碎片空间,此时删除数据后重建索引可以使索引树更“紧凑”,提高磁盘空间利用率。

Innodb中的B+树模型中,N叉树的N能否被修改?

  1. 通过调整索引字段大小来修改
    N 叉树中非叶子节点存放的是索引信息,索引包含 Key 和 Point 指针。Point 指针固定为 6 个字节,假如 Key 为 10 个字节,那么单个索引就是 16 个字节。如果 B + 树中页大小为 16 K,那么一个页就可以存储 1024 个索引,此时 N 就等于 1024。我们通过改变 Key 的大小,就可以改变 N 的值。

  2. 通过修改页大小间接修改,页越大,每页存放的索引数量就越多,N就越大。

数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。

如何知道语句有没有走索引查询?

可以利用 explain 查看 sql 语句的执行计划,通过执行计划来分析索引使用情况。

写在最后

喜欢本文的朋友,欢迎关注公众号「会玩 code」,专注大白话分享实用技术。

公众号福利

回复【mysql】获取免费测试数据库!!
回复【pdf】获取持续更新海量学习资料!!

您可能感兴趣的文档:

--结束END--

本文标题: mysql 索引十连问| 剑指 offer - mysql

本文链接: https://lsjlt.com/news/8449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql 索引十连问| 剑指 offer - mysql
    以下是结合网上及此前面试时遇到的一些关于mysql索引的面试题。 若对mysql索引不太了解可先翻阅相关文章 大白话 mysql 之深入浅出索引原理 - 上 大白话 mysql 之深入浅出索引原理 - 下 什么是索引? 索引类似书本的...
    99+
    2015-10-12
    mysql 索引十连问| 剑指 offer - mysql
  • mysql索引失效的十大问题小结
    目录背景一、查询条件包含or,可能导致索引失效二、如何字段类型是字符串,where时一定用引号括起来,否则索引失效三、like通配符可能导致索引失效。四、联合索引,查询时的...
    99+
    2024-04-02
  • MySQL 全文索引使用指南
    全文索引需要特殊的查询语法。有没有索引都可以进行全文检索,但是存在索引时会提高匹配的速度。全文索引的索引通过特殊的结构存储以便于找到文档中包含搜索关键字对应的内容。在我们日常生活中,最常见的全文检索就是网络搜索引擎。...
    99+
    2022-05-14
    MySQL 全文索引 MySQL 索引
  • MySQL中索引指的是什么
    这篇文章将为大家详细讲解有关MySQL中索引指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。索引是什么?一张表有 500 万条数据,在没有索引的 name 字段上...
    99+
    2024-04-02
  • MySQL索引与事务问题
    下一节将会讲到JDBC相关编程, 敬请期待~~~~~  目录 1. 索引 1.1 什么是索引 1.2索引的使用场景 1.3索引相关代价 1.4索引背后的数据结构(B+树) 2.事务 2.1什么是事务 2.2为什么使用...
    99+
    2023-10-02
    mysql
  • MySQL唯一索引指的是什么
    这篇文章给大家分享的是有关MySQL唯一索引指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个...
    99+
    2024-04-02
  • mysql索引指的是什么意思
    这篇文章主要介绍了mysql索引指的是什么意思,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。MySQL官方对索引的定义为:索引(Index)是帮...
    99+
    2024-04-02
  • MySQL索引详解,面试必问
    1、什么是索引?   索引是帮助MySQL高效获取数据的数据结构(有序)。   在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是...
    99+
    2018-10-09
    MySQL索引详解,面试必问
  • Mysql索引常见问题汇总
    Q1:数据库有哪些索引?优缺点是什么? B树索引:大多数数据库采用的索引(innoDB采用的是b+树)。能够加快访问数据的速度,尤其是范围数据的查找非常快。缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,如果...
    99+
    2022-05-17
    MySQL 索引 MySQL 索引问题
  • MySQL索引是啥?不懂就问
    目录概述从二叉树到B+树聚集索引非聚集索引联合索引和覆盖索引B+树索引VS哈希索引普通索引和唯一索引InnoDB VS MyISAM用explain分析索引使用总结概述 以下是需要创建索引的常见场景,为了对比,创建测...
    99+
    2022-05-20
    MySQL MySQL索引
  • 如何解析MySQL索引问题
    今天就跟大家聊聊有关如何解析MySQL索引问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。0 前言这篇文章不会讲解索引的基础知识,主要是关于MyS...
    99+
    2024-04-02
  • MySQL索引失效十种场景与优化方案
    目录1 数据准备1.1 新建数据表1.2 新增100万条数据2 基础知识2.1 explain type2.2 explain Extra3 索引失效场景3.1 查询类型错误3.1....
    99+
    2023-05-19
    MySQL索引失效场景 MySQL索引优化 MySQL索引失效与优化
  • mysql中前缀索引指的是什么
    这篇文章主要为大家展示了“mysql中前缀索引指的是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中前缀索引指的是什么”这篇文章吧。1、说明有时候需要索引很长的字符列,索引变得又大...
    99+
    2023-06-15
  • mysql中索引与FROM_UNIXTIME的问题示例
    小编给大家分享一下mysql中索引与FROM_UNIXTIME的问题示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!零、背景简...
    99+
    2024-04-02
  • mysql order by 索引问题综合分析
    一,文章1 Mysql-索引失效 order by优化_orderby索引失效_zyk1.的博客-CSDN博客 总结: 0,索引 与 查询条件 与 排序字段关系,Using filesort出现场景 联合索引,最左匹配原则,不仅查询条件需要...
    99+
    2023-09-03
    mysql 数据库
  • 浅谈MySQL中不等号索引问题
    目录1.当不等号<>作用在普通索引字段上2.当不等号<>作用在主键索引字段上3.当不等号<>作用在唯一索引字段上最近在使用mysql中的一个小总结。 在MySQL中,不等号<&g...
    99+
    2023-03-20
  • MySQL索引失效问题怎么解决
    MySQL索引失效问题可能是由于索引选择不当、数据分布不均匀、查询条件不符合索引规则等原因造成的。解决这些问题可以尝试以下方法: ...
    99+
    2024-04-09
    mysql
  • MySQL添加索引特点及优化问题
    目录一、索引的特点二、索引类型1.FULLTEXT2.HASH3.BTREE4.RTREE三、索引种类四、索引的使用策略1.什么时候要使用索引?2.什么时候不要使用索引?3.索引失效的情况4.mysql查询优化5.索引的...
    99+
    2022-07-22
    MySQL添加索引特点 MySQL添加索引优化
  • MySql批量插入与唯一索引问题
    MySQL批量插入问题 在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接受的SQL语句大小受限制所以我每次批量虽然只有500条,但依然无...
    99+
    2024-04-02
  • MySQL之主键索引排序失效问题
    目录主键索引排序失效现在初始化几行数据查一下所有记录查看一下执行计划总结主键索引排序失效 环境:mysql8 有一张用户信息表user_info,建表DDL如下: CREATE TABLE `user_info` ( ...
    99+
    2022-12-27
    MySQL主键索引 主键索引排序失效 MySQL索引失效
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作