当前位置: 首页 > news >正文

【myISAM和innoDB】mySql的引擎myisam和innodb的区别/mysiam

目录

Myisam 和Innodb 特点和擅长

Myisam 和Innodb 数据存储区别

Myisam引擎(非聚集索引--叶子节点存储数据地址的指针)

 Innodb引擎(聚集索引---叶子节点的data直接包含数据)

B+Tree的特性

行锁和表锁的区别

 
引擎在不断的发展(比如InnoDB发展),所以不会去记具体的特性,在选型的时候才去看和对比。

简单点说。。。

没啥特殊的话请使用innodb。 myisam已被放弃。

(mySQL 选择B+树作为 索引的数据结构https://www.cnblogs.com/htyj/p/10995630.html)

Myisam 和Innodb 特点和擅长

读操作多用 MyISAM 写操作多用 InnoDB

1、myisam查询效率更高,查询效率差myisam6-7倍。

2、innodb支持事务,行锁,外键。myisam不支持。

如果数据表涉及的存储数据多、查询多,用myisam,如文章表。如果数据表涉及业务逻辑多,增删改操作多,就用innodb,如订单表。

区别:

1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

5、InnoDB支持行锁

6、InnoDB:5.6以后才有全文索引;

 MyISAM:支持全文索引;不支持事务;它是表级锁;会保存表的具体行数.

如何选择:

1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;

2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。

3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;

4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

推荐用InnoDB引擎.加了索引之后能够大幅度的提高查询速度,但是索引也不是越多越好,一方面它会占用存储空间,另一方面它会使得写操作变得很慢。通常我们对查询次数比较频繁,值比较多的列才建索引。
  例如:select * from user where sex = "女", 这个就不需要建立索引,因为性别一共就两个值,查询本身就是比较快的。
     select * from user where user_id = 1995 ,这个就需要建立索引,因为user_id的值是非常多的。

摘自:https://www.zhihu.com/question/20596402

Myisam 和Innodb 数据存储区别

Myisam引擎(非聚集索引--叶子节点存储数据地址的指针)

  若以这个引擎创建数据库表Create table user (…..),它实际是生成三个文件:

  user.myi   索引文件     user.myd数据文件     user.frm数据结构类型。

   如下图:当我们执行  select * from user where id = 1的时候,它的执行流程。

    (1)查看该表的myi文件有没有以id为索引的索引树。

    (2)根据这个id索引找到叶子节点的id值,从而得到它里面的数据地址。(叶子节点存的是索引和数据地址)。

    (3)根据数据地址去myd文件里面找到对应的数据返回出来。

    

 

 Innodb引擎(聚集索引---叶子节点的data直接包含数据)

  若以这个引擎创建数据库表Create table user (…..),它实际是生成两个文件:

  user.ibd   索引文件        user.frm数据结构类型

  因为innodb引擎创建表默认就是以主键为索引,所以不需要myi文件。

  下图为innodb表的结构图:很显然它与myisam最大的区别是将整条数据存在叶子节点,而不是地址。(叶子节点存的是主键索引数据信息)

  若此时,你在其他列创建索引例如name,它就会另外创建一个以name为索引的索引树,(叶子节点存的是索引和主键索引)。

  你在执行select * from user where name = ‘吴磊’,他的执行过程如下:

    (1)找到name索引树

    (2)根据name的值找到该树下叶子的name索引和主键值

    (3)用主键值去主键索引树去叶子节点到该条数据信息

   

https://www.cnblogs.com/wlwl/p/9465583.html 

B+Tree的特性

  (1)由图能看出,单节点能存储更多数据,使得磁盘IO次数更少

  (2)叶子节点形成有序链表,便于执行范围操作。

  (3)聚集索引中,叶子节点的data直接包含数据;非聚集索引中,叶子节点存储数据地址的指针。

行锁和表锁的区别

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;    
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

MyISAM表锁

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;
MyISAM表的读操作与写操作之间,以及写操作之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

相关文章:

  • 【文档/键值数据库】文档数据库和键值数据库有什么区别
  • 【JDBC与JPA】JDBC与JPA
  • Apache+Tomcat配置转发
  • 【SQLite】SQLServerCompact/SQLiteToolboxVS的SQLite插件使用
  • 【mysql索引】MySQL索引原理及慢查询优化
  • 【趋势和新技术】趋势和技术
  • 【mysql中文编码】mysql中文乱码中文编码问题
  • 【RPC】为什么需要RPC,而不是简单的HTTP接口
  • 【JAVA】java中implements和extends的使用小结
  • 【postgreSQL】Postgres-XL--基于PostgreSQL的开源分布式实现
  • 【python C结构体】Python Ctypes结构体指针处理(函数参数,函数返回)
  • 【慢查询log】MySQL慢查询日志的配置与使用教程
  • 【安装gcc】centOS6、6.5、6.8、6.9……安装/升级gcc方法
  • 【Django工程目录】Django工程目录结构优化
  • 【二叉树】二叉树的遍历规则(前序遍历、后序遍历、中序遍历)|前/后/中缀表达式...
  • ECMAScript6(0):ES6简明参考手册
  • Effective Java 笔记(一)
  • express.js的介绍及使用
  • java取消线程实例
  • Phpstorm怎样批量删除空行?
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • webpack入门学习手记(二)
  • 复杂数据处理
  • 开发基于以太坊智能合约的DApp
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一道闭包题引发的思考
  • 一起参Ember.js讨论、问答社区。
  • zabbix3.2监控linux磁盘IO
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #大学#套接字
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (JS基础)String 类型
  • (rabbitmq的高级特性)消息可靠性
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (第二周)效能测试
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (算法)求1到1亿间的质数或素数
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Thymeleaf用法——Thymeleaf简介
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .describe() python_Python-Win32com-Excel
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net - 类的介绍
  • .NET Core引入性能分析引导优化
  • .NET DataGridView数据绑定说明
  • .net6使用Sejil可视化日志
  • .net程序集学习心得
  • .NET分布式缓存Memcached从入门到实战
  • .NET连接MongoDB数据库实例教程
  • .net项目IIS、VS 附加进程调试
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作