为什么要使用索引?

最简单的方式实现数据查询:全表扫描,即将整张表的数据全部或者分批次加载进内存,由于存储的最小单位是块或者页,它们是由多行数据组成,然后逐块逐块或者逐页逐页地查找,这样查找的速度非常慢。优点:在数据量小比如只有几十行数据的情况下很快。但数据量大时不适用。更通常情况下,我们应该避免全表扫描,我们可以通过索引来大幅提升查询数据的速度。

什么信息能够成为索引?

能把记录限制在一定查找范围内的字段,比如键,唯一键,主键等

B+ Tree更适合用来做索引原因:

1.B+ 树的磁盘读写代价更低。因为它的非叶子节点只存储索引而不存储具体数据,因此其内部节点相对B Tree 更小。如果把所有内部节点的关键字存放在同一盘块中,这个盘块能容纳的关键字数量就更多,一次性读入内存中的需要查找的关键字也越多,相对来说,I/O次数就降低了。

2.B+ 树查询效率更加稳定。其内部节点并不是最终指向文件内容的节点,而只是叶子节点中关键字的索引,所以任何关键字的查找必定有一条从根节点到叶子节点的路径。所以关键字查询的长度相同,导致每个数据的查找效率也几乎是相同的稳定的,都是0log(n)

  1. B+ 树更有利于对数据库的扫描。B+ 树只需要遍历叶子节点就可以对全部关键字信息的扫描,在做范围查询时效率很高。

如何优化索引?

1.哈希索引

缺点:

①仅仅能满足“=”,“IN",不能使用范围查询。哈希索引比较的是进行哈希运算之后的哈希值,所以它只能用于等值的过滤,不能用于基于范围的查询,因为经过哈希运算之后的哈希值不能保证和原来的键值一样

②无法被用来避免数据的排序操作。由于哈希索引存储的是经过哈希运算之后的值,而且哈希值不一定和原来的键值一样,所以数据库无法利用索引的数据来避免任何排序运算。

③不能利用部分索引键查询。

④不能避免表扫描。哈希索引是将索引键通过哈希运算之后的哈希值和对应的行指针信息存放在一个bucket当中,由于不同的索引建会出现相同的哈希值,所以即使取出满足某个哈希键值的那些数据,也无法从哈希索引中直接完成查询,还是要通过访问bucket中的实际数据进行相应的比较。

⑤遇到大量Hash值相等的情况后性能并不一定就会比B树索引高。极端情况下所有数据可能插入到一个桶中,如果正好要查询最后一条数据,就变成线性的了。

2.BitMap

缺点:只适用于固定字段的值,而且锁的粒度非常大,不适用于并发场景,OLAP而不是OLTP

密集索引和稀疏索引的区别?

如何定位并优化慢查询sql?

  • 根据慢日志定位慢查询sql
  • 使用explain等工具分析sql
  • 修改sql或者尽量让sql走索引

type关键字段:如果出现了all字段,则表示进行了全表扫描,效率非常低。

最左匹配原则

MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如果查询条件为后面的一列或几列,则无法用到此索引。如下:

select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx ; // 无法命中索引 

通常让选择性最强的索引列放在前面。

索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高。

最左匹配原则的成因?

mysql创建联合索引的规则是首先对联合索引最左边的索引字段的数据进行排序,然后在此基础上在对第二个索引进行排序,类似于“order by 字段1,order by 字段2,.......”。第一个字段绝对有序,第二个字段就是无序的了。因此通常情况下,直接使用第二个字段条件判断是用不到索引的。

索引是建立的越多越好吗?

  • 数据量小的表不需要建立索引。建立索引会增加额外的索引开销
  • 数据变更需要维护索引,因此更多的索引意味着更多的成本
  • 更多的索引意味着也需要更多的空间

索引的优点

  • 大大减少了服务器需要扫描的数据行数
  • 可以让服务器避免进行排序和分组,以及避免创建临时表(B+Tree索引本身就是有序的,可以用于ORDER BY和GROUP BY操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)
  • 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)

索引的使用条件

  • 对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效;
  • 对于中到大型的表,索引就非常有效;
  • 但是对于特大型的表,建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配,例如可以使用分区技术。

Mysql的B+ Tree索引的更多相关文章

  1. MYSQL之B+TREE索引原理

    1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...

  2. MYSQL的B+Tree索引树高度如何计算

    前一段被问到一个平时没有关注到有关于MYSQL索引相关的问题点,被问到一个表有3000万记录,假如有一列占8位字节的字段,根据这一列建索引的话索引树的高度是多少? 这一问当时就被问蒙了,平时这也只关注 ...

  3. Mysql B-Tree和B+Tree索引

    Mysql B-Tree和B+树索引 Mysql加快数据查找使用B-Tree数据结构存储索引数据,InnoDB存储引擎实际使用B+Tree.下面首先介绍下B-Tree和B+Tree的区别: 一.B树和 ...

  4. MySQL的B树索引与索引优化

    MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  5. Mysql B-Tree, B+Tree, B*树介绍

    [摘要] 最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB还支持B+Tree索引,Memory ...

  6. mysql存储引擎和索引

    正确的创建合适的索引,是提升数据库查询性能的基础. 第一章 mysql之索引 索引的定义:索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 我们为什么要使用索引: a.极大的减少存储引 ...

  7. 高性能mysql 第五章 索引部分总结

    高性能索引 1.索引基础:索引的作用类似'目录'帮助Query来快速定位数据行. 1.1索引类型: 1.1.1 b-tree索引 b-tree(balance tree)索引:使用平衡树(非平衡二叉树 ...

  8. 【mysql】mysql表分区、索引的性能测试

    概述 mysql分区表概述:google搜索一下: RANGE COLUMNS partitioning 主要测试mysql分区表的性能: load 500w 条记录:大约在10min左右: batc ...

  9. 高性能MySQL中的三星索引

    高性能MySQL中的三星索引 我对此提出了深深的疑问: 一星:相关的记录指的是什么??(相关这个词很深奥,“相关部门”是什么部门) 二星:如果建立了B-Tree(B+Tree)索引,数据就有序了.三星 ...

随机推荐

  1. 宏旺半导体深度剖析嵌入式存储芯片eMMC原理 一篇概括大全

    eMMC 一直是嵌入式存储市场最主流的选择,除了读写速度快.性价比高外,在节省空间方面也是相当优秀,今天宏旺半导体就和大家详细聊聊eMMC. eMMC 是 embedded MultiMediaCar ...

  2. Java集合类的概述

    前述 复习一下Java中的集合类,是面试笔试中常考察的一个点,特地做的整理. 什么是集合类? 集合类,也叫容器类.Java集合类可以用来存储数量庞大的对象. 我们和数组进行对比: 数组:存储基本数据类 ...

  3. 以Spring Cache扩展为例介绍如何进行高效的源码的阅读

    摘要 日常开发中,需要用到各种各样的框架来实现API.系统的构建.作为程序员,除了会使用框架还必须要了解框架工作的原理.这样可以便于我们排查问题,和自定义的扩展.那么如何去学习框架呢.通常我们通过阅读 ...

  4. 一个内存不能被written的问题

    C程序面试中曾经面试过这样一道题: #include <stdio.h> int main() { char *p = "12345"; *p = '6'; print ...

  5. 【分治】黑白棋子的移动-C++

    题目描述 有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也 ...

  6. 如何入门 MySQL

    如何入门MySQL 前言: 关于如何入门MySQL,后台有好多同学咨询我,可能部分读者刚开始学习MySQL,我前面发的文章对部分同学来说暂时接触不到.原本写技术文章的目的是记录自己的工作学习,没有考虑 ...

  7. [LeetCode] 32. Longest Valid Parentheses (hard)

    原题链接 题意: 寻找配对的(),并且返回最长可成功配对长度. 思路 配对的()必须是连续的,比如()((),最长长度为2:()(),最长长度为4. 解法一 dp: 利用dp记录以s[i]为终点时,最 ...

  8. sql上传木马

    第十周笔记—SQLmap和sql注入上传木马 目录 第十周笔记—SQLmap和sql注入上传木马 SQL注入 上传木马 SQLmap 六大模块 命令 参数 三种请求方式 取得系统shell sqlma ...

  9. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

  10. 【iOS】the executable was signed with invalid entitlements

    又遇到了这个问题,貌似之前遇到过,如图所示: 原因:开发证书里没添加手机. PS: Xcode7 除外,据说已经不需要证书了,这里用的是 6.4