MySql存储引擎

MySql5.5之后的默认存储引擎为InnoDB。  

    1.ARCHIVE

用于存储大量数据,不支持索引。

    2.BLACKHOLE

不存储数据,每次查询始终返回空。

    3.CSV

在文本文件中以逗号分隔值格式存储数据。

    4.InnoDB

MySQL 5.5之后的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。

    5.MEMORY/HEAP

提供内存中的表,以前称为堆。它在RAM中处理所有数据,以便比在磁盘上存储数据更快地访问。用于快速查找引用和其他相同的数据。

    6.MRG_MYISAM

一组MyIsam的组合,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。可以直接从数据表里面操作, 也可以直接在mrg表里面,删除mrg表,不会影响实际表的数据。

    7.MyISAM

该存储引擎管理非事务性表,提供高速存储和检索,支持全文搜索。

    8.PERFORMANCE_SCHEMA

主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表

    9.NDB

数据全部放在内存中、查询速度极快,主键查找的速度极快,并且通过添加NDB数据存储节点可以线性地提高数据库性能,是高可用、高性能的集群系统。缺点:需要巨大的网络开销

.......                                    

MySql索引

索引是帮助高效获取数据的排好序的数据结构。

索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页;

聚集索引可以避免数据插入操作集中于表的最后一个数据页。

最左前缀原理

当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

引用一个大佬的结论:

原文链接:

索引按数据结构分类

  • Hash表

基于hash表结构实现的索引,mysql中只有MEMORY/HEAP和NDB存储引擎支持;

  • B-Tree

b+tree基于平衡二叉树的一种多路平衡查找树(为了减少磁盘I/O的次数提高查询效率),所有记录都按照顺序存放在叶子节点中,各个叶子节点直接通过链表相连。与b树不同的是:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

Hash表索引与B-Tree索引对比

Hash索引是比较其中的hash值,当进行精确查找的时候效率非常高。并且当发生大量hash碰撞的时候会使其查询效率与空间利用率大大降低。并且Hash索引无法进行范围查找和排序,因为哈希值是无序的。使用hash索引时因为hash碰撞的原因也会进行全表扫描。

因为大部分的系统和业务处理都需要使用到范围查找与统计相关操作,索引B+Tree索引使用较多。

什么是B+Tree?

1、关键字集合分布在整棵树中;

2、任何一个关键字出现且只出现在一个结点中;

3、搜索有可能在非叶子结点结束;

4、其搜索性能等价于在关键字全集内做一次二分查找

5、自动层次控制;

6、非叶子节点只存储键值信息。

7、所有叶子节点之间都有一个链指针。

8、数据记录都存放在叶子节点中。

java es Reindex从源索引中选择部分字段_索引