美文网首页程序员
MySql性能调优一(存储引擎InnoDB,MyISAM)

MySql性能调优一(存储引擎InnoDB,MyISAM)

作者: yuan_dongj | 来源:发表于2018-03-29 16:52 被阅读0次

    前言

    最近想学习mysql性能调优,先看了mysql存储引擎,mysql在建表时可选多个存储引擎。目前有一个浅显的理解,记个笔记,忘了之后可以回来看看。 MySql存储引擎.png

    区别

    • MyISAM基于ISAM存储引擎,并对其进行扩展,不支持事务。
      InnoDB给mysql提供了事物提交、回滚等事物安全的存储引擎。

    • MyISAM采用表级锁。表级锁开销小,加锁快,锁粒度大,冲突概率高,并发度低,不会出现死锁。
      InnoDB支持表级锁与行级锁,默认为行级锁。行级锁开销大,加锁慢,锁粒度小,冲突概率低,并发度高,会出现死锁。

    • MyISAM读写操作是串行的,如果读写同时操作同一张表,写进程优先获取锁,所以不适合有大量更新与读取操作的项目,适合读操作多的少量数据。
      InnoDB存储引擎完全与mysql服务整合,是为处理巨大数据量的最大性能设计。

    • MyISAM不支持外键。对一个包含外键的InnoDB表转为MYISAM会失败。
      InnoDB支持外键。

    • MyISAM不保存表记录数,select count(1) from xxx会全表扫描。
      InnoDB保存。但是,select count(1) from xxx where xxx仍然会全表扫描。

    • MyISAM引擎创建数据库将会产生3个文件,.frm存储表结构,.MYD存储表数据,.MYI存储表索引,索引被压缩过。
      InnoDB索引与数据紧密捆绑,索引没有压缩。在索引方面的内存使用率,不如MyISAM。

    MyISAM表级锁

    MySql表级锁有两种:表共享读锁与表独占写锁。

    锁共享模式.png

    MyISAM在执行查询前,会自动执行表的加锁、解锁操作。

    读锁不会影响查询,但会限制更新本客户端与其他客户端的更新。
    //注:图中示例表yc_tablelock的存储引擎为MyISAM

    表共享读锁.png

    可以使用表锁来保证两次查询的是同一时间点数据,当然,也可以用union并集。

    lock table yuanchong_table1,yuanchong_table2 read;
    select colum1 from yuanchong_table1;
    select colum2 from yuanchong_table2;
    UNLOCK tables;
    

    写锁时,运行自身进行读写操作,但会限制其他客户端的读写操作。

    表独占写锁.png

    InnoDB表级锁与行级锁

    共享锁(读锁):允许其他客户端进行读操作,但不允许写操作。不允许其他客户端给这几行记录上排他锁,但允许上共享锁。
    上共享锁写法:lock in share mode

     select  *  from yuanchong_table where id>60 lock in share mode;
    

    排他锁(写锁):不允许其他客户端进行读操作,不允许写操作。不允许其他客户端给这几行上排他锁与共享锁。
    上排他锁写法:for update

     select  *  from yuanchong_table where id>60 for update;
    

    死锁:A事物锁住1-5行,B事物锁住6-10行。A事物请求锁住6-10行,阻塞。B事物请求锁住1-5行,阻塞。锁是对表操作的,自如表锁不存在死锁。

    注:
    • 行锁必须有索引才能实现,否则就会锁全表。
    • 两个事物不能同时锁同一个索引。
    • insert,delete,update在事物中会默认自动加上排他锁。

    相关文章

      网友评论

        本文标题:MySql性能调优一(存储引擎InnoDB,MyISAM)

        本文链接:https://www.haomeiwen.com/subject/intvcftx.html