mysql 的INNODB引擎和MYISAM引擎的区别、索引相关
两个引擎都是使用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引擎的区别、索引相关的更多相关文章
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- mysql之InnoDb引擎与MyISAM引擎对比
InnoDb引擎 支持ACID的事务,支持事务的四种隔离级别: 支持行级锁及外键约束:因此可以支持写并发: 不存储总行数: 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制, ...
- B-Tree 和 B+Tree 结构及应用,InnoDB 引擎, MyISAM 引擎
1.什么是B-Tree 和 B+Tree,他们是做什么用的? B-Tree是为了磁盘或其它存储设备而设计的一种多叉平衡查找树,B-Tree 和 B+Tree 广泛应用于文件存储系统以及数据库系统中. ...
- MySQL的InnoDB引擎与MyISAM引擎
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- mysql innodb存储引擎和myisam引擎
InnoDb存储引擎面向在线事务处理,其特点是行锁设计.支持外键.并支持Oricle似得非锁定读(所谓非锁定读是如果数据库实例读取的行正在进行更新或删除操作当前读取不会等待当前锁的释放而是读取当前行的 ...
- MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解
转 http://blog.csdn.net/hsd2012/article/details/51112009 转 http://blog.csdn.net/e421083458/article/de ...
- MySQL学习笔记之二---引擎介绍MyISAM VS InnoDB
前言 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一 ...
- MYSQL 的静态表和动态表的区别, MYISAM 和 INNODB 的区别
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
- MySql(三):MyISAM和InnoDB区别详解
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
随机推荐
- C#10 新功能
C# 10.0 向 C# 语言添加了以下功能和增强功能: 记录结构 结构类型的改进 可使用 const 内插字符串 内插字符串处理程序 global using 指令 文件范围的命名空间声明 扩展属性 ...
- JDK安装及JAVA_HOME配置
1.用yum list搜索合适的JDK yum list java-1.8* 这里选用jdk1.8版本,在列表中找到java-1.8.0-openjdk.x86_64. 2.用yum安装JDK yum ...
- 串口通讯之rs232 c++版本
rs232.cpp #ifndef kranfix_rs232_rs232_cc #define kranfix_rs232_rs232_cc #include "rs232.h" ...
- 两天两夜,1M图片优化到100kb!
坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙--王小二! 自从因为一篇报道登上热搜后,我差点抑郁,每天要靠 50 片安眠药才能入睡. 网络上曝光的那些关于一码通的消息,有 ...
- 安装CentOS时,推荐的分区方案
最佳分区设置取决于 Linux 系统的用途.
- python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...
- JS-购物车
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ffmpeg修改视频文件的分辨率
在本文中,我们将展示如何调整任何视频文件的大小. 这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案. 更改视频文件的分辨率将是 ...
- 通信原理:基于MATLAB的AM调幅分析
目的: 通过matlab仿真AM调制,通过图像分析来更好的了解AM调制的过程 1.为什么基带信号要加上一个直流分量. 2.所加直流分量为什么要大于基带信号的最大值. 3.时域中调制信号与载波和基带信号 ...
- OpenCv基础_三
轮廓检测 图像金字塔 上采样,图像变大一倍,矩阵用0填充 img = cv2.imread('1,jpg') cv_show('img',img) up = cv2.pyrUp(img) cv_sho ...