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:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
随机推荐
- PON/产线测试解决方案
第一章 方案背景与概述1.1 方案背景随着网络的高速发展与网络速率的不断提升,用户对网络产品的可靠性要求也越来 越高.网络产品的故障符合"浴盆曲线"规律,生产过程中的严格测试能够及 ...
- BI可视化在线分析工具,推荐这2个BI工具!
一.国外BI----tableau BI平台Tableau帮助企业可视化和理解数据.它使组织能够通过PC或iPad连接,可视化和共享数据.用户可以轻松创建仪表板,发布甚至与同事,合作伙伴和客户共 ...
- vs2022 如何让.net库文件参与程序调试【可以.net库文件的源代码中设置断点,单步跟踪】
由于.net core 是开源的.所以可以让.net库文件参与程序调试.具体vs2022配置如下 1.设置VS2022 加载程序数据文件(.pdb俗称符号文件) 1)选择工具>选项>调试& ...
- windows系统如何远程桌面连接
转至:https://jingyan.baidu.com/article/67662997adb46a54d51b84bd.html 远程桌面连接是一种通过网络技术,远程操作另一台电脑的过程,随着wi ...
- 如何修改oracle数据库用户密码过期策略
转至:https://www.cnblogs.com/zhangshuaihui/p/11451590.html 1. 查询数据库用户何时过期 登陆数据库PL/SQL工具,输入以下sql语句: s ...
- 分布式多线程 EOFError: Ran out of input
原因: 在将Queue注册到网上的时候,callable参数使用了lambda匿名函数,而Windows下绑定调用接口不能用lambda QueueManager.register('get_task ...
- SyntaxError: keyword can't be an expression
创建字典对象时: D1=dict('name'='Bob','age'=20,'score'=90) SyntaxError: keyword can't be an expression 解决方法: ...
- 题解 CF17E 【Palisection】
卡空间PAM,2010没有PAM,所以都是马拉车 众所周知,PAM拥有十分优秀的时间复杂度,但空间复杂度lj得不行 但这题卡空间,所以得用到邻接链表PAM 先讲思路 题目要求相交的回文子串对,这很难做 ...
- springboot Redistemplate的execute和 executePipelined
springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别 1.execute 以下是 springboot 官网原文: Redis p ...
- 《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 为甚,撸Mybatis 我就知道,你会忍不住对它下手! 21年带着粉丝伙伴撸了一遍 Sp ...