问题:请讲下mysql中的索引

分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质?

回答要点:

主要从以下几点去考虑

1、索引的本质是什么

2、mysql的索引分类;

3、每种分类的依据;

mysql在日常的开发中使用非常广泛,经常会提到的一句是在进行优化的时候,要对索引进行优化,那么到达什么是索引那。

索引其实是一种数据结构,建立索引的目的是为了提高查询效率。如果没有索引那么存储在磁盘中的数据(mysql中的数据归根结底是存储在磁盘中的),就需要扫描磁盘,把磁盘中的数据挨个扫描并进行比较,判断是否为需要的数据,为了提高查询的效率,增加一个索引的数据结构,在查找数据的时候先通过读取索引,找到要查找数据的主键或数据地址,然后根据找到的主键或数据地址去硬盘定位数据,这样比直接扫描磁盘要快很多。

mysql中,myIsam和nnodb两种数据引擎,底层的索引结构都是B+树。

从数据和索引是否在一起可以分为聚集索引和非聚集索引。

聚集索引

聚集索引,索引记录和数据存储在一起,inndob引擎下的主键索引便是聚集索引,其索引树的叶子节点存储的是主键和对应的行记录

非聚集索引

非聚集索引,当时是索引记录和数据是分开存储的,myIsam引擎下的索引都是非聚集索引,其索引树的叶子节点存储的是索引列和对应数据行的地址;要查询数据首先通过索引树找到对应的数据地址,然后根据地址进行查询;

innodb下的非主键索引不严格意义上来说也可以算作非聚集索引,因为非主键索引的叶子节点存储的是索引列和主键值,这里的主键值可以看作是数据地址;

从索引列是否为主键可以分为主键索引和普通索引

主键索引

主键索引,以主键建立的索引树,在inndob下必须要有主键索引,也就是必须要有主键,在建表时最好设置主键,在不设置主键的情况下,mysql会选择一个唯一性的列作为主键,如果没有唯一列则会默认生成一个自增的row_id作为主键,也就是说inndob的表肯定有主键索引,因为主键索引的叶子节点存储的是对应的行记录且仅有一份,没有主键索引就没有数据。

普通索引

普通索引,非主键的索引都叫普通索引,可以分为单列索引和联合索引(多列索引),单列索引就是一个列建立的索引;联合索引就是多个列组成的索引,联合索引就涉及索引的最左匹配原则。普通索引的叶子节点存储的是索引列和对应的主键值。在命中普通索引的情况下,找到主键值后,需要根据主键值再查找主键索引方可查询到对应的数据,而命中主键索引时则可以直接查找到数据,所以主键索引查询效率一般较高。

上面说到了索引的分类及优点,最大的优点就是提高查询效率,但也不是索引越多越好,因为索引作为一种数据结构也是要占磁盘空间的,在更新、插入、删除数据的同时也要维护索引结构会耗费时间,不能为了提高查询效率而牺牲更新操作的效率,需要合理的设置每张表的索引数量,一般5--6个为最好。

java面试一日一题:讲下mysql中的索引的更多相关文章

  1. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  2. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  3. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  4. java面试一日一题:mysql中的自增主键

    问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...

  5. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  6. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  7. java面试一日一题:binlog undolog redolog的区别

    问题:请讲下mysql中binlog.undolog.redolog三种日志的区别 分析:mysql中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别: 回答要点: 主要 ...

  8. java面试一日一题:请讲下对mysql的理解

    问题:请讲下对mysql的理解 分析:该问题主要考察对mysql的理解,基本概念及sql的执行流程 回答要点: 主要从以下几点去考虑, 1.mysql的整体架构? 2.mysql中每一个组件的作用? ...

  9. java面试一日一题:mysql事务是如何实现的

    问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...

随机推荐

  1. css3自动换行排列

    如果一行放不下就会自动换行 display: flex; flex-wrap: wrap; 示例 : html <div class="container"> < ...

  2. docker的安装和基本的docker命令、镜像和容器的操作

    1.yum 包更新到最新 yum update 2.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum insta ...

  3. FutureTask源码分析(JDK7)

    总览 A cancellable asynchronous computation. This class provides a base implementation of {@link Futur ...

  4. pytorch中多个loss回传的参数影响示例

    写了一段代码如下: import torch import torch.nn as nn import torch.nn.functional as F class Test(nn.Module): ...

  5. Qt update刷新之源码分析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt刷新事件(QEvent::UpdateRequest)的处理流程,这次视频主要从源码层面剖析对刷新事件的进一步处理, ...

  6. 非对称加密--密钥交换算法DHCoder

    /*  * 密钥交换算法,即非对称加密算法  * */ public class DHCoder {         //非对称加密算法         public static final Str ...

  7. elf.h

    1 /* This file defines standard ELF types, structures, and macros. 2 Copyright (C) 1995-2019 Free So ...

  8. 6、MyBatis教程之日志实现

    7.日志实现 思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题. 对于以 ...

  9. 真会C#微信小程序的习题数据JSON文件下载链接

    完全没有精力去维护了,所以小程序停掉,集中精力做一件事. 链接: https://pan.baidu.com/s/1xL45KxDzR5oEQM6nwBA5rw 提取码: qv6n

  10. 在 .NET Core 中使用 ViewConfig 调试配置

    介绍 .NET Core 中的配置包含了多个配置提供程序,包括了 appsettings.json,环境变量,命令行参数等,还有一些扩展的自定义提供程序,比如说 ApolloConfig,AgileC ...