page contents

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

以下内容希望帮助到大家!

attachments-2020-06-ArYoJIge5ed7654d3dba3.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表级锁有两种:表共享读锁与表独占写锁。

attachments-2020-06-RbaSPQVV5ed7658ad0fa8.jpg

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

读锁不会影响查询,但会限制更新本客户端与其他客户端的更新。

//注:图中示例表yc_tablelock的存储引擎为MyISAM

attachments-2020-06-3h0cxJ7l5ed765962d943.jpg


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

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

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

attachments-2020-06-TeT80KBa5ed765bb447a9.jpg

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在事物中会默认自动加上排他锁。



attachments-2020-06-Pgt7XDoa5ed7653ba27c2.jpg

  • 发表于 2020-06-03 16:56
  • 阅读 ( 527 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章