• MySQL常见面试题(四)


    😀前言
    在进行数据库设计和优化的过程中,我们不得不面对多样化的技术和方法来确保我们的系统可以高效、可靠地运行。为了深入了解和掌握这个领域,我们将讨论InnoDB存储引擎的多种索引类型,以及索引的不同方面和分类。我们还将深入探讨为什么通常推荐使用自增列作为主键,以及主键和唯一键之间的区别。最后,我们将提供一系列可用于SQL语句优化的方法。
    .
    了解这些概念不仅可以帮助我们更好地设计和维护数据库系统,还可以帮助我们识别和解决性能问题,从而确保数据库的高效运行。

    🏠个人主页:尘觉主页
    在这里插入图片描述

    🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

    在csdn获奖荣誉: 🏆csdn城市之星2名
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
    ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
    如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

    InnoDB中只有B+树索引吗?

    InnoDB存储引擎不仅仅有B+树索引,它还支持全文索引、哈希索引。

    InnoDB存储引擎内部自己去监控索引表,如果监控到某个索引经常用,那么就认为是热数据,然后内部自己创建一个hash索引,称之为自适应哈希索引( Adaptive Hash Index,AHI)。使用的哈希函数采用除法散列方式,其冲突机制采用链表方式。我们对这个自适应哈希索引能够干预的地方很少,只能设定是否启用和分区个数。

    从MySQL5.6.x开始,InnoDB开始支持全文检索,内部的实现机制就是倒排索引。但是MySQL整体架构上对全文检索支持并不好而且限制很多,比如每张表只能有一个全文检索的索引,不支持没有单词界定符( delimiter)的语言,所以如果有大批量或者专门的全文检索需求,还是应该选择专门的全文检索引擎。

    什么是密集索引和稀疏索引?

    密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引。

    稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键。

    mysam存储引擎,不管是主键索引,唯一键索引还是普通索引都是稀疏索引,innodb存储引擎:有且只有一个密集索引。

    所以,密集索引就是innodb存储引擎里的聚簇索引,稀疏索引就是innodb存储引擎里的普通二级索引。

    为什么要用自增列作为主键?

    1、如果我们定义了主键(PRIMARY
    KEY),那么InnoDB会选择主键作为聚集索引。

    如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。

    如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

    2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放

    因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

    3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页

    4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置。此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE
    TABLE来重建表并优化填充页面。

    主键和唯一键有什么区别?

    主键不能重复,不能为空,唯一键不能重复,可以为空。

    建立主键的目的是让外键来引用。

    一个表最多只有一个主键,但可以有很多唯一键

    说说对SQL语句优化有哪些方法?(选择几条)

    (1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

    (2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

    (3) 避免在索引列上使用计算

    (4)避免在索引列上使用IS NULL和IS NOT NULL

    (5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    (6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    (7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

    😄总结

    通过本文的讨论,我们深入了解了InnoDB存储引擎的索引类型和特点,包括B+树索引、哈希索引和全文索引。我们还讨论了密集索引和稀疏索引的概念,以及它们在不同的存储引擎中的实现和使用。此外,我们还了解了为什么通常建议使用自增列作为主键,以及它与其他类型的键的比较。

    我们还探讨了主键和唯一键之间的区别,强调了主键的重要性和唯一性,以及它们在数据库设计中的作用。

    最后,我们提供了一系列SQL语句优化的方法,包括对WHERE子句的优化和正确使用索引,以避免全表扫描和不必要的计算。这些优化方法可以帮助我们创建更高效、更可靠的数据库系统。

    希望通过这次阅读,你已经获得了更多的见识和理解,可以更好地进行数据库设计和优化,从而保证你的系统能够高效和可靠地运行。

    😁热门专栏推荐
    想学习vue的可以看看这个

    java基础合集

    数据库合集

    redis合集

    nginx合集

    linux合集

    手写机制

    微服务组件

    spring_尘觉

    springMVC

    mybits

    等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

    🤔欢迎大家加入我的社区 尘觉社区

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
    希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
    如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

  • 相关阅读:
    如何在Java中读取超过内存大小的文件
    【论文阅读】CVPR2022: Learning from all vehicles
    BCN点击试剂:1516551-46-4,BCN-succinimidylester,BCN NHS
    基于人工蜂群算法的新型概率密度模型的无人机路径规划(Matlab代码实现)
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java创新实践学分管理系统08a30
    [极致用户体验] 我又来帮掘金修专栏bug了,顺便教你个超牛逼的分割线CSS!
    2015款奔驰B200车发动机故障灯异常点亮
    Hadoop集群WordCount详解
    Linux基础命令汇总
    一文读懂网络效应对Web3的重要意义
  • 原文地址:https://blog.csdn.net/apple_67445472/article/details/133062017