iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >数据库中90%程序员面试会遇到的索引优化问题有哪些
  • 758
分享到

数据库中90%程序员面试会遇到的索引优化问题有哪些

2024-04-02 19:04:59 758人浏览 安东尼
摘要

这篇文章主要介绍数据库中90%程序员面试会遇到的索引优化问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于索引,分为以下几点来讲解(技术文):索引的概述(什么是索引,索引的

这篇文章主要介绍数据库中90%程序员面试会遇到的索引优化问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

关于索引,分为以下几点来讲解(技术文):

  • 索引的概述(什么是索引,索引的优缺点)

  • 索引的基本使用(创建索引)

  • 索引的基本原理(面试重点)

  • 索引的数据结构(B树,hash)

  • 创建索引的原则(重中之重,面试必问!敬请收藏!)

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

一、索引的概述

1)什么是索引?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,索引就相当于目录。当你在用新华字典时,帮你把目录撕掉了,你查询某个字开头的成语只能从第一页翻到第一千页。累!把目录还给你,则能快速定位!

2)索引的优缺点:

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。,且通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。但是,索引也是有缺点的:索引需要额外的维护成本;因为索引文件是单独存在的文件,对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的io,会降低增/改/删的执行效率。

二、索引的基本使用(真技术文)

1)创建索引:(三种方式)

第一种方式:

数据库中90%程序员面试会遇到的索引优化问题有哪些

第二种方式:使用ALTER TABLE命令去增加索引:

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

数据库中90%程序员面试会遇到的索引优化问题有哪些

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。

索引名index_name可自己命名,缺省时,Mysql将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

第三种方式:使用CREATE INDEX命令创建

CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)

数据库中90%程序员面试会遇到的索引优化问题有哪些

三、索引的基本原理(不想像别的文章那样一大堆篇幅废话)

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

      1、把创建了索引的列的内容进行排序

      2、对排序结果生成倒排表

      3、在倒排表内容上拼上数据地址链

      4、在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

四、索引的数据结构(b树,hash)

1)B树索引

mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

数据库中90%程序员面试会遇到的索引优化问题有哪些

查询方式:

主键索引区:PI(关联保存的时数据的地址)按主键查询,

普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快

B+tree性质:

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

2)哈希索引(好技术文)

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。

数据库中90%程序员面试会遇到的索引优化问题有哪些

ps:关于数据结构,有兴趣深入的朋友可以关注我后查看【数据结构】专题,这里不做详细讲解。

五、创建索引的原则(重中之重)

索引虽好,但也不是无限制的使用,最好符合一下几个原则

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)较频繁作为查询条件的字段才去创建索引

3)更新频繁字段不适合创建索引

4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)

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

6)定义有外键的数据列一定要建立索引。

7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。

8)对于定义为text、image和bit的数据类型的列不要建立索引。

百万级别或以上的数据如何删除(真好技术文)

关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

  • 所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)

  • 然后删除其中无用数据(此过程需要不到两分钟)

  • 删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。

  • 与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。

常用的数据库索引优化语句

使用如下的表tb_test作为示例进行说明:

create table tb_test
(
id int not null,
age int not null, 
name varchar(30) not null,
addr varchar(50) not null
);
create unique index idx1_tb_test on tb_test(id);
create index idx2_tb_test on tb_test(name);
create index idx3_tb_test on tb_test(addr);

索引优化建议

1.对索引列进行计算

例如,我们想要将表tb_test中id大于100的数据记录中的age和name查找出来。

正确的SQL语句是:

select age,name from tb_test where id > 1*100;

不建议采用的SQL语句是:

select age,name from tb_test where id/100 > 1;

2.对索引列进行拼接

例如,我们想要将表tb_test中name为“zhou”、addr为“CQ”的记录中的id和age查找出来。

正确的SQL语句是:

select id,age from tb_test where name='zhou' and addr='CQ';

不建议采用的SQL语句是:

select id,age from tb_test where concat(name,' ‘,addr) = ‘zhou CQ';

3.在索引列上is null或is not null的使用

例如,我们想要将表tb_test中id大于等于“0”的记录中的age查找出来。

正确的SQL语句是:

select age from tb_test where id >= 0;

不建议采用的SQL语句是:

select age from tb_test where id is not null;

4.在索引列上or的使用

例如,我们想要将表tb_test中id等于101或102的记录中的age和name查找出来。

正确的SQL语句(使用uNIOn)是:

select age,name from tb_test where id = 101 union select age,name from tb_test where id = 102;

不建议采用的SQL语句(使用or)是:

select age,name from tb_test where id = 101 or id = 102;

5.尽可能避免索引列在like的首字符使用通配符

例如,我们想要将表tb_test中name匹配“zho”的记录中的id和age查找出来。

正确的SQL语句是:

select id,age from tb_test where name like ‘zho%';

不建议采用的SQL语句是:

select id,age from tb_test where name like ‘%ho%';

6.复合索引的使用

如果我们建立的索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引。

例如,我们在表tb_test上新建了如下索引:

create index idx4_tb_test on tb_test(id,name,addr);

以上索引idx4_tb_test相当于建立了index(id)、index(id,name)、index(id,name,addr) 这3个索引。在SQL语句的where条件中单独使用name或addr时不会使用到该索引,必须使用id时才会使用到该索引。

在我们编写的SQL语句中,不正确地使用索引列可能会导致索引不被使用,而进行全表扫描,极大地降低了数据库的性能。因此,学习正确的索引的使用方法实在是很有必要的。

以上是“数据库中90%程序员面试会遇到的索引优化问题有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 数据库中90%程序员面试会遇到的索引优化问题有哪些

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库中90%程序员面试会遇到的索引优化问题有哪些
    这篇文章主要介绍数据库中90%程序员面试会遇到的索引优化问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于索引,分为以下几点来讲解(技术文):索引的概述(什么是索引,索引的...
    99+
    2024-04-02
  • Mysql数据库索引面试题(程序员基础技能)
    目录引言索引原理1、数据页2、页目录3、索引原理分析总结引言 索引是Mysql的一块硬骨头,但是对于程序猿来说又是十分重要的基础技能。在平常的项目开发中,它是重要的SQL优化手段。在...
    99+
    2024-04-02
  • pytorch中DataLoader()过程中会遇到的问题有哪些
    这篇文章将为大家详细讲解有关pytorch中DataLoader()过程中会遇到的问题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如下所示:RuntimeError: stack expects ...
    99+
    2023-06-15
  • PHP程序员遇到问题的冷门知识点有哪些
    这期内容当中小编将会给大家带来有关PHP程序员遇到问题的冷门知识点有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。有些时候我们习惯了主流的方法,每一步都按部就班的写代码,殊不知,我们可能会遗漏一些好的...
    99+
    2023-06-04
  • 小程序开发中遇到的问题有哪些
    这篇文章主要介绍小程序开发中遇到的问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!小程序面试题bindtap和catchtap的区别是什么?bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止...
    99+
    2023-06-14
  • Android小程序开发中遇到的问题有哪些
    本篇内容介绍了“Android小程序开发中遇到的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!渲染列表时用 block 包裹<...
    99+
    2023-06-29
  • 小程序开发过程中遇到的问题有哪些
    这篇文章主要介绍了小程序开发过程中遇到的问题有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇小程序开发过程中遇到的问题有哪些文章都会有所收获,下面我们一起来看看吧。1、确定需求问题虽然说小程序是可以作为服务...
    99+
    2023-06-27
  • 前端JS面试中经常会被问到的问题有哪些
    本篇内容介绍了“前端JS面试中经常会被问到的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题1...
    99+
    2024-04-02
  • 优化你的数据库性能有哪些问题
    这篇文章将为大家详细讲解有关优化你的数据库性能有哪些问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  在优化你的数据库时,你可能没有用到这些细节的优点。...
    99+
    2024-04-02
  • Java中关于数据库的面试题有哪些
    这篇文章主要介绍了Java中关于数据库的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。面试题1:说一下你对聚集索引与非聚集索引的理解,以及他们的区别?首先解释一下...
    99+
    2023-06-20
  • MySQL数据库中建立索引的优缺点有哪些
    MySQL数据库中建立索引的优缺点有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。为什么要创建索引呢  这是因为,创建索引可以大大提高系统...
    99+
    2024-04-02
  • 微信小程序中遇到的iOS兼容性问题有哪些
    这篇文章主要介绍了微信小程序中遇到的iOS兼容性问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.iOS中input的placeh...
    99+
    2024-04-02
  • 面试官经常问到的Go语言数据类型问题有哪些?
    Go语言是一门越来越受欢迎的编程语言,它在各种场景下都表现出色。在面试中,面试官经常会问到关于Go语言数据类型的问题。本文将介绍几个常见的问题,并提供相应的演示代码。 基本数据类型 在Go语言中,基本数据类型包括bool、string、...
    99+
    2023-08-18
    数据类型 面试 git
  • ASP 框架面试中常见的大数据问题有哪些?
    ASP框架面试中常见的大数据问题有哪些? ASP框架是一种非常流行的Web开发框架,但是在面试中,可能会被问到一些关于大数据处理的问题。这些问题不仅考验了面试者的编程技能,还考察了他们对于大数据处理的理解。本文将介绍ASP框架面试中常见的大...
    99+
    2023-10-10
    框架 面试 大数据
  • Java应用程序中的类路径和索引有哪些常见问题?
    Java是一种强大的编程语言,它被广泛用于开发各种应用程序。在Java应用程序中,类路径和索引是非常重要的概念。它们控制着应用程序的加载和执行。在本文中,我们将探讨Java应用程序中的类路径和索引有哪些常见问题。 一、类路径 在Java应用...
    99+
    2023-09-01
    load path 索引
  • Java面试中出现率极高的数据库查询题有哪些
    这篇文章将为大家详细讲解有关Java面试中出现率极高的数据库查询题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基本表结构:teacher(tno,tname) 教...
    99+
    2024-04-02
  • 日志存储在Java程序中的数据类型选择有哪些需要注意的问题?
    在Java程序中,日志是一种非常重要的信息,可以帮助我们了解程序的运行情况、问题所在、以及性能瓶颈等。因此,合理地存储日志信息对于程序的调试和性能优化非常有帮助。在存储日志信息时,我们需要注意选择合适的数据类型,以便能够充分利用存储空间,...
    99+
    2023-07-31
    数据类型 日志 存储
  • SQLServer 错误 41349 警告:为包含具有持续性 SCHEMA_AND_DATA 的一个或多个内存优化表的数据库启用了加密。 不会对这些内存优化表中的数据加密。 故障 处理 修复 支持远程
    详细信息 Attribute 值 产品名称 SQL Server 事件 ID 41349 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 HK_ENCRYPTION_ON 消息正文 警告...
    99+
    2023-11-05
    内存优化 多个 会对
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作