为什么要使用索引?

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

什么信息能够成为索引?

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

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. 18.linux基础优化

    1.linux系统的基础优化 (1)关闭selinux sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 临时关闭 ...

  2. 20131209-数据库导入导出数据-sqlhelper-第十七天

    [1] 导出数据 namespace _05导出数据 { class Program { static void Main(string[] args) { string str = "Da ...

  3. 20141111-WCF获得Web路径

    在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中想使用Server.Map获取当前服务发布目录的绝对路径. ...

  4. Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现

    昨天已经搭建好了SpringBoot基于Maven的基础父子级项目,今天开始进入项目分模块及分布式实现.首先我们基于昨天的项目,在父级工程下建lyn-sys,lyn-customer,lyn-good ...

  5. 哈夫曼编码与解码的C++实现:建立哈夫曼树、进行哈夫曼编码与解码

    最近完成了数据结构课程设计,被分到的题目是<哈夫曼编码和解码>,现在在这篇博文里分享一下自己的成果. 我在设计时,在网上参考了很多老师和前辈的算法和代码,向他们表示感谢!他们的成果给了我很 ...

  6. Excel催化剂100+大主题功能梳理导读

    Excel催化剂历经1年4个月的开发时间,终于荣登100+个大主题功能,完成数据领域的功能大矩阵,可以说在日常的数据处理及分析上,绝大部分的共性场景已经囊括其中,是数据工作者难得一遇的优秀作品之一.因 ...

  7. 浅入深出Vue:代码整洁之去重

    在开始本篇的主题之前,让我们把上次遗留下来的问题都清理一下: 将其他组件中 axios 请求的地方封装起来. 这里就不把代码放在开头了,相关代码都放在文末,有兴趣了解的童鞋可以先往下翻. 好了, 我们 ...

  8. sysctl -p详解

    个人一般sysctl -p 或sysctl -a比较多使用 sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发.IP碎片去除以及源路由检 ...

  9. IntegerCache的妙用和陷阱

    转载自IntegerCache的妙用和陷阱 考虑下面的小程序,你认为会输出为什么结果? public class Test {     public static void main(String[] ...

  10. C语言和内存

    1.程序的运行 对cpu来说,内存只是一个存放指令和数据的地方,具体的运算在cpu内完成. 1.寄存器(Register) 是CPU内部非常小.非常快速的存储部件,它的容量很有限,对于32位的CPU, ...