两个引擎都是使用B+tree 数据结构作为索引

不同点:

1、INNODB的主键必须要有,同时也是聚集索引,INNODB的数据文件本身就是索引文件;而MYISAM则是存储了数据的地址

2、INNODB的辅助索引,会存储主键的地址(所以建议不要把主键的长度设置过大,一般用自增的数字即可),使用辅助索引搜索的时候,也是先关联到主键,在使用主键进行查询;而MYISAM 的辅助索引跟主键没有任何区别,只是主键唯一,辅助索引不唯一而已。

3、INNODB 支持事务;MYISAM 不支持事务

4、INNODB是行锁;MYISAM 是表锁

---------------------------------------------------------------------

为什么mysql 会使用B+tree 数据结构作为索引

1、B+Tree 数据结构,能让树的深度h很小的情况下,就能加载很多的叶子节点。这样的结构,就算是在很多的数据中查询,也会让每次的数据查询深度很小,也就是log h(m),m 是叶子节点的数量

2、B+Tree 的叶子的有序性,充分利用了磁盘预读的特点。由于数据都是存储在磁盘上的,根据理论,一个数据被查询到,那么它附近的数据通常也会被查询到。而利用磁盘预读,可以把预读到的数据,按照每一页存放在B+Tree的节点上,而节点的叶子节点数,通常都是跟磁盘的页的容量是相等的。

--------------------------------------------------------------------

使用索引的注意事项:

1、由于B+Tree的叶子节点的有序性,强烈建议,主键使用的跟业务无关的,自增的数据。如果跟业务相关的话,对数据进行插入或者修改,会导致叶子节点的频繁移动,降低性能

2、如果有联合索引<a,b>,根据最左匹配原则,查询条件时候,单独使用a列,也就是:where a=xxx,会使用到索引;但是如果单独使用b,也就是: where b=xxx,那么索引会失效

3、不要使用函数(包括聚合函数),表达式 作用于索引上,这样会使索引试失效

4、如果要使用like 作用于索引上,请使用 like xxx%,而不是 like %xxx 或like %xxx%

5、可以使用前缀索引,也就是取列的前面一部分作为索引

6、如果列的值得数量(capacity)很多,但是变化的值(distinct)很少,那么这个列不适合作为索引。典型的列如:性别。计算公式:v=distinct/capacity。v的取值范围是(0,1]

mysql 的INNODB引擎和MYISAM引擎的区别、索引相关的更多相关文章

  1. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  2. mysql之InnoDb引擎与MyISAM引擎对比

    InnoDb引擎 支持ACID的事务,支持事务的四种隔离级别: 支持行级锁及外键约束:因此可以支持写并发: 不存储总行数: 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制, ...

  3. B-Tree 和 B+Tree 结构及应用,InnoDB 引擎, MyISAM 引擎

    1.什么是B-Tree 和 B+Tree,他们是做什么用的? B-Tree是为了磁盘或其它存储设备而设计的一种多叉平衡查找树,B-Tree 和 B+Tree 广泛应用于文件存储系统以及数据库系统中. ...

  4. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  5. mysql innodb存储引擎和myisam引擎

    InnoDb存储引擎面向在线事务处理,其特点是行锁设计.支持外键.并支持Oricle似得非锁定读(所谓非锁定读是如果数据库实例读取的行正在进行更新或删除操作当前读取不会等待当前锁的释放而是读取当前行的 ...

  6. MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

    转 http://blog.csdn.net/hsd2012/article/details/51112009 转 http://blog.csdn.net/e421083458/article/de ...

  7. MySQL学习笔记之二---引擎介绍MyISAM VS InnoDB

    前言 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一 ...

  8. MYSQL 的静态表和动态表的区别, MYISAM 和 INNODB 的区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  9. MySql(三):MyISAM和InnoDB区别详解

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

随机推荐

  1. 一文告诉你dashboard究竟有多重要!

    dashboard,我们一看这个词可能会觉得困惑,这是什么意思?看起来很高大上的样子. 实际上它的中文含义即是我们BI界老生常谈的话题--仪表盘.dashboard是商业智能仪表盘的简称,它是一般商业 ...

  2. 【C#基础概念】元数据 metadate

    元数据是指"描述资料的资料".它被用来概述资料的基础信息,以简化查找过程与方便使用[6]. 创建资料的方法 资料的用途 创建的时间与日期 资料的创建者或作者 资料被创建在电脑网络的 ...

  3. 【C# 基础概念】静态常量和动态常量的区别

    C# 静态常量和动态常量的区别 C#中有两种常量类型分别为readonly(运行时常量)与const(编译时常量),readonly是变量的常量,const是字面量的常量本文将就这两种类型的不同特性进 ...

  4. Nullable<T> 结构 |T? 可为空的值类型

    参考链接:https://www.cnblogs.com/tdfblog/p/Nullable-Types-in-Csharp-Net.html https://www.cnblogs.com/min ...

  5. Qt:QNetworkRequest

    0.说明 QNetworkRequest类代表被QNetworkAccessManager发送的请求. QNetworkReuqest是网络访问API的一部分,在其内部保留了在网络上发送一个reque ...

  6. 使用 yapi-to-typescript 生成接口响应数据的 TS 类型声明

    TS 是越写越爽,但是很不爽的是接口响应数据一堆,每次要去手写很麻烦. 最近正好后端接口文档从一个垃圾工具切换到了 Yapi,然后去搜了下可以通过接口文档自动生成 TS 类型声明,就自己搞了下,还是很 ...

  7. 学习Java集合

    1.列表  List接口(继承于Collection接口)及其实现类 List接口及其实现类是容量可变的列表,可按索引访问集合中的元素. 特点:集合中的元素有序.可重复: 列表在数据结构中分别表现为: ...

  8. Laravel 自定命令以及生成文件

    以创建service层为例子 1.执行命令 php artisan make:command ServiceMakeCommand 2.在app\Console\Commands 下就会多出一个 Se ...

  9. Kubernetes系列(二)Service

    作者: LemonNan 原文地址: https://juejin.im/post/6863704173931593736 Service Kubernetes 的 Service 可以为一组具有相同 ...

  10. 2022:checking for Python executable "python2" in the PATH

    目录 一.node报错 说明 1.网上常用方法一(本博主环境无效) 2.网上常用方法二(本博主环境无效) 3.本博主使用方法(当前有效) 1.确保NodeJS环境安装没有问题,如果不会安装,请参考 构 ...