精华内容
下载资源
问答
  • 为什么myisam查询比innodb快? 主要原因有三点: 查询的时候,由于innodb支持事务,所以会有mvvc的一个比较。这个过程会损耗性能。 查询的时候,如果走了索引,由于innodb是聚簇索引,会有一个回表的过程,即:先去...

    是什么

    1. 了解这个问题,需要先了解innobd和myisam先。这两个是数据库的实现引擎,其中innodb是比较新的,myisam是5.5之前用的,双方各自有各自的优点。详情请看

    问题解答(需要对于innodb和myisam有一定的理解才看得懂)

    为什么myisam查询比innodb快?
    主要原因有三点:

    1. 查询的时候,由于innodb支持事务,所以会有mvvc的一个比较。这个过程会损耗性能。
    2. 查询的时候,如果走了索引,由于innodb是聚簇索引,会有一个回表的过程,即:先去非聚簇索引树中查询数据,找到数据对应的key之后,再通过key回表到聚簇索引树,最后找到需要的数据。而myisam直接就是簇集索引,查询的时候查到的最后结果不是聚簇索引树的key,而是磁盘地址,所以会直接去查询磁盘。详解
    3. 锁的一个损耗,innodb锁支持行锁,在检查锁的时候不仅检查表锁,还要看行锁。

    参考

    1. innodb的优点
    展开全文
  • 一、MyISAMInnoDB区别:1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 ...

    一、MyISAM与InnoDB区别:

    1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

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

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

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

    5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

    我们重点来了解他们的表锁差异和索引差异:

    1、表锁差异

    MyISAM:myisam只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。也可以通过lock table命令来锁表,这样操作主要是可以模仿事务,但是消耗非常大,一般只在实验演示中使用。

    InnoDB :Innodb支持事务和行级锁,是innodb的最大特色。

    事务的ACID属性:atomicity,consistent,isolation,durable。

    并发事务带来的几个问题:更新丢失,脏读,不可重复读,幻读。

    事务隔离级别:未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable)

    2、索引差异

    1、关于自动增长

    myisam引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

    innodb引擎的自动增长咧必须是索引,如果是组合索引也必须是组合索引的第一列。

    2、关于主键

    myisam允许没有任何索引和主键的表存在,

    myisam的索引都是保存行的地址。

    innodb引擎如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见)

    innodb的数据是主索引的一部分,附加索引保存的是主索引的值。

    3、关于count()函数

    myisam保存有表的总行数,如果select count(*) from table;会直接取出出该值

    innodb没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre 条件后,myisam和innodb处理的方式都一样。

    4、全文索引

    myisam支持 FULLTEXT类型的全文索引

    innodb不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询)

    5、delete from table

    使用这条命令时,innodb不会从新建立表,而是一条一条的删除数据,在innodb上如果要清空保存有大量数据的表,最 好不要使用这个命令。(推荐使用truncate table,不过需要用户有drop此表的权限)

    6、索引保存位置

    myisam的索引以表名+.MYI文件分别保存。

    innodb的索引和数据一起保存在表空间里。

    二、如何选择:

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

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

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

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

    20c7bf80b693c5598a5337498bb55fcc.png
    展开全文
  • 源 /php中文网 源 /www.php.cnMySQL有多种存储引擎,MyISAMInnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是...

    点击蓝字fefdb0862a2b65957858e98489f762f2.png关注我们!每天获取最新的编程小知识!

    源 / php中文网      源 / www.php.cn

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。

    MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件存放表格定义;数据文件是MYD (MYData);索引文件是MYI (MYIndex)。

    InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如like操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

    核心区别

    MyISAM是非事务安全型的,而InnoDB是事务安全型的。

    MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

    MyISAM支持全文类型索引,而InnoDB不支持全文索引。

    MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

    MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

    InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。

    应用场景

    MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

    InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

    Mysql的存储引擎和索引

    数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将关键字存储到树的节点即可。当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。 这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(clustered index ),一种叫做非聚簇索引(secondary index)。这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。

    InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。

    MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

    为了更形象说明这两种索引的区别,我们假想一个表如下图存储了4行数据。其中Id作为主索引,Name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。

    cc28aec1dd6acf7c2cc9249747675148.png

    我们重点关注聚簇索引,看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

    1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。

    2 辅助索引使用主键作为"指针" 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置(实现中通过16K的Page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的B+树节点分裂以及Page的分裂),使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。

    所以在百万级数据及更大数据情况下,mysql innoDB 的索引表现更加优秀!

    -END-

    声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!

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

    区别:

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

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

    3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。

           MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

           也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针

    df4d2366199db45295b83b9004340482.png

    15f4ed5be3f4ec720d6f14ca2f61d569.png

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

    那么为什么InnoDB没有了这个变量呢?

        因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。InnoDB会尝试遍历一个尽可能小的索引除非优化器提示使用别的索引。如果二级索引不存在,InnoDB还会尝试去遍历其他聚簇索引。

        如果索引并没有完全处于InnoDB维护的缓冲区(Buffer Pool)中,count操作会比较费时。可以建立一个记录总行数的表并让你的程序在INSERT/DELETE时更新对应的数据。和上面提到的问题一样,如果此时存在多个事务的话这种方案也不太好用。如果得到大致的行数值已经足够满足需求可以尝试SHOW TABLE STATUS

    5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了

    6. MyISAM表格可以被压缩后进行查询操作

    7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁

           InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。

    例如:     t_user(uid, uname, age, sex) innodb;     uid PK    无其他索引    update t_user set age=10 where uid=1;             命中索引,行锁。     update t_user set age=10 where uid != 1;           未命中索引,表锁。     update t_user set age=10 where name='chackca';    无索引,表锁。

    8、InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有

    9、Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI

            Innodb:frm是表定义文件,ibd是数据文件

            Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

    如何选择:

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

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

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

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

    InnoDB为什么推荐使用自增ID作为主键?

        答:自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

    innodb引擎的4大特性

           插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)

    展开全文
  • 一、什么是存储引擎存储引擎说白了就是如何存储数据、如何存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和...
  • 为什么MyISAM比Innodb的查询速度

    千次阅读 2018-08-06 00:21:45
    为什么MyISAM比Innodb的查询速度? https://blog.csdn.net/bluetjs/article/details/52455253 INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多: 1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这...
  • 为什么MyISAM比Innodb的查询速度
  • 为什么MyISAM比Innodb的查询速度 查询了半天,都copy的一个回答.我想用自己的大白话来解释一下: myisam只加载了索引数据缓存进内存,加载的数据量少,相同时间内加载进内存的的索引也就更多,所以可以使cpu在相同...
  • InnoDB、MylSAM两者引擎所用的索引的数据结构都是B+树,不过区别在于: MylSAM中的B+树的数据结构存储的内容是实际数据的地址值,它...1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减少; ...
  • 建表及插入数据聚簇索引和非聚簇...下面我们看 InnoDBMyISAM 是如何存储下面这个表:DROP TABLE IF EXISTS `test`; -- 若表已存在,则删除CREATE TABLE test ( id INT NOT NULL, num int NOT NULL, tag CHAR(...
  • 为什么MyISAM比Innodb的查询速度。 MyISAM和 innodb 的实现上的区别? 业务上区别很多. INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多: 1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间...
  • 第一时间获取技术干货和业界资讯! ...哎呀,一年之计在于春啊。最近过完年了,微信群里有非常多的...所以,经常酱油,不知道该学习什么? 于是,我发了一套面试题,如下: 结果,他们都来要答案了。哎,做...
  • 一、InnoDB实现原理虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。因为InnoDB支持聚簇索引(主键索引),聚簇索引就是表,所以InnoDB不用像MyISAM那样需要独立的行存储。也就是说,InnoDB的...
  • 作者:你在我家门口juejin.im/post/5cabf...1. UNION ALL 与 UNION 的区别UNION和UNION ALL关键字都是将两个结果集合并一个。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排...
  • 继续刷mysql的面试题:1.一张表,里面有 ID 自增主键,当 ...一般情况下,我们创建的表的类型是 InnoDB ,如果新增一条记录(不重启 MySQL 的情况下),这条记录的 ID 是9 ;但是如果重启 MySQL 的话,这条记录的 ID...
  • ​上一篇文章讲到,应用程序通过数据库连接池将请求发送给 MySQL,...MySQL 是支持多种存储引擎的,比如说 MyISAMInnoDB、Memory 等,你可以用show storage engines;来查看在用的 MySQL 支持哪些存储引擎。在 Inn...
  • 因为主键和行记录就存储在一起,定位到了主键,也就定位到了所要找的记录,当前行的所有字段都在这(这也是为什么我们说,在创建表的时候,最好是创建一个主键,查询时也尽量用主键来查询)。 对于普通索引,如例子中...
  • 但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?Mysql内部到底是怎么处理的?今天这篇文章将从Mysql内部对于count函数是怎样处理的来展开详细的讲述。count的实现方式在Mysql中的不同的存储引擎对...
  • 关注私信回复:555领取Java高级架构资料、Spring源码分析、Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式等InnoDB 引擎数据存储在 InnoDB 存储引擎中,也有页的概念,默认每个页的大小 16K,也就是每次...
  • mysql之MyISAMInnoDB

    千次阅读 2017-07-20 16:21:54
    最近在学习mysql的优化方面,这里当然逃不开mysql的...然而面试官听我说了以后,说了句你说MyISAM查询速度比Innodb快,能告诉我为什么吗。听到这,一时语塞,我只知道是这样,至于为什么,天呐,没研究呀。当面试...
  • 子查询 可以将子查询放在许多的 SQL 子句中,包括: • WHERE 子句• HAVING 子句 • ... 示例 --谁的薪水 Oldlu 高 单行子查询多行子查询MySQL 中的正则表达式 MySQL 中允许使用正则表达式定义字符串的搜索条件...
  • 存储引擎概念数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制... MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Fede...
  • 1:Mysql索引是什么mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引。可简单理解排好序的快速查找数据结构。如果要查“mysql”这个单词,我们肯定需要...
  • 目录 区别: 1、默认引擎 2、事务 3、外键 4、索引 5、表内行总数 6、fulltext全文索引 ...为什么MyISAM比Innodb 的查询速度 如何选择: 其他引擎: 其他几种类型引擎的特点 原文:htt...
  • MySQL锁级别MyISAM 表锁表锁介绍表锁是MySql中最基本的锁策略,并且是开销最小的策略,表锁将整张表加锁。表锁模式:表共享读锁和表独占写锁表锁兼容性1. 当一个进程获得了表的读锁,不会阻塞其他进程对同一表的读...
  • 索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。索引是一种数据结构,...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

为什么myisam比innodb快