问题:请讲下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. Sapper:迈向理想的 Web 应用框架

    ​扎稳阵脚,再进一步. 注意:原文发表于2017-12-31,随着框架不断演进,部分内容可能已不适用. 给迫不及待的小伙伴们的快速入门:Sapper 文档 和快速模板 starter template ...

  2. vscode中js文件使用typescript语法报错,如何解决

    原因:由于vcode自身的语法检查有些问题 解决办法:在设置里面加上 "javascript.validate.enable": false 禁用默认的 js 验证 总结: 由于v ...

  3. 微信小程序onReachBottom第二次失效

    当整个页面就是一个view包着一个轮播.一个横向scroll-view和一个纵向scroll-view onReachBottom方法只执行一次 解决方法:

  4. 面试题-python 如何读取一个大于 10G 的txt文件?

    前言 用python 读取一个大于10G 的文件,自己电脑只有8G内存,一运行就报内存溢出:MemoryError python 如何用open函数读取大文件呢? 读取大文件 首先可以自己先制作一个大 ...

  5. MySQL时间戳unix_timestamp

    函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法:FROM_UNIXTIME(unix_timestamp, ...

  6. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)

    [概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...

  7. Fcitx5 上线 FreeBSD

    Fcitx5 上线 FreeBSD textproc/fcitx5textproc/fcitx5-qttextproc/fcitx5-gtktextproc/fcitx5-configtoolchin ...

  8. 🚩数分工作了三年,我干了件很酷的事情

    从17年毕业来,一直都在干数据分析的工作.和很多转行的小伙伴一样,没有对口的科班学习,摸不清数据分析具体情况,起初充满着很多迷茫. 在刚开始的1年半中,都是自己从淘宝买些课程,最多时,网盘放了4-5T ...

  9. 【odoo】ref 1-6说明

    (0,_ ,{'field': value}) 这将创建一个新的记录并连接它          (1,id,{'field': value}): 这是更新一个已经连接了的记录的值          ( ...

  10. [LOJ 572] Misaka Network 与求和

    一.题目 点此看题 二.解法 直接推柿子吧: \[\sum_{i=1}^n\sum_{j=1}^nf(\gcd(i,j))^k \] \[\sum_{d=1}^nf(d)^k\sum_{i=1}^{n ...