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:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
随机推荐
- python中类似c++静态方法的一个记录
个人学习c++出身,在后面的工作中接触到python,见到一些classmethod的字眼有点疑惑,所以进行一些记录. 都知道的是,c/c++中有着静态成员,静态方法的存在,比如: class A: ...
- 这款智能又高效的自助式BI工具,你应该了解一下
如今,企业的经营面临越来越激烈的竞争,如何将数据的价值发挥到最大化,成为众多企业急需解决的问题.如果部署数据分析平台还像以前那样要经历漫长实施过程的话,那么数据化运营将成为空谈.在市场需求的催化下,& ...
- BI驾驶舱是什么?BI管理驾驶舱主要内容及特点
BI驾驶舱,顾名思义就是商业智能中让企业管理者对企业的管理能够找到在飞机或汽车驾驶舱里面的驾驶感觉.BI管理驾驶舱系统是专为企业管理层设计的BI分析系统,,是为企业高层打造的虚拟办公场景,有利于更好地 ...
- 【C# 线程】开篇 线程
概述 线程主要学习什么,通过一个月的摸索.终于总结出来了:学习Thread类涉及到学习Thread类涉及到线程单元状态: ApartmentState.GetApartmentState\SetApa ...
- 谷歌集群数据 clusterdata-2011-2 Cluster workload traces
谷歌集群数据 clusterdata-2011-2 https://github.com/google/cluster-data/blob/master/ClusterData2011_2.md 链接 ...
- mongodb之shard分片
总的 1:在3台独立服务器上,分别运行 27017,27018,27019实例, 互为副本集,形成3套repl set 2: 在3台服务器上,各配置config server, 运行27020端口上 ...
- Python面向对象之数据封装的应用及配置文件
面向对象封装的应用 1.配置文件 1.1 ini配置文件 ini 文件是Initialzation File的缩写,平时用于存储软件的配置文件.例如:MySQL数据库的配置文件(my.ini) [my ...
- JavaWeb-数据库基础
数据库基础 推荐阅读: 数据库:https://www.cnblogs.com/zwtblog/tag/数据库/ 数据库是学习JavaWeb的一个前置,只有了解了数据库的操作和使用,我们才能更好地组织 ...
- appium滚动查找屏幕外的控件
嗯,还是把自己做的实验保存一下 Appium1.12.1+python2.7 实验滚动,查找屏幕外控件以及控制seekbar scroll() 是根据页面中两个元素位置之间的距离进行滑动. 滑动寻找屏 ...
- 如何从头到脚彻底解决一个MySQL Bug
摘要:为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例. 说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL. 华为云数据库新版本在发布之前,会 ...