MySQL优化

转载 2007年09月24日 18:51:00
锁机制

当前MySQL已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了,BDB 表支持页级锁,InnoDB 表支持行级锁。

很多时候,可以通过经验来猜测什么样的锁对应用程序更合适,不过通常很难说一个锁比别的更好,这全都要依据应用程序来决定,不同的地方可能需要不同的锁。

想要决定是否需要采用一个支持行级锁的存储引擎,就要看看应用程序都要做什么,其中的查询、更新语句是怎么用的。例如,很多的web应用程序大量的做查询,很少删除,主要是基于索引的更新,只往特定的表中插入记录。采用基本的MySQL MyISAM 表就很合适了。

MySQL中对表级锁的存储引擎来说是释放死锁的。避免死锁可以这样做到:在任何查询之前先请求锁,并且按照请求的顺序锁表。

MySQL中用于 WRITE(写) 的表锁的实现机制如下:

 

如果表没有加锁,那么就加一个写锁。

否则的话,将请求放到写锁队列中。

MySQL中用于 READ(读) 的表锁的实现机制如下:

 

如果表没有加写锁,那么就加一个读锁。

否则的话,将请求放到读锁队列中。

当锁释放后,写锁队列中的线程可以用这个锁资源,然后才轮到读锁队列中的线程。

这就是说,如果表里有很多更新操作的话,那么 SELECT 必须等到所有的更新都完成了之后才能开始。

从 MySQL 3.23.33 开始,可以通过状态变量 Table_locks_waited 和 Table_locks_immediate 来分析系统中的锁表争夺情况:

 

mysql> SHOW STATUS LIKE 'Table%';

+-----------------------+---------+

| Variable_name | Value |

+-----------------------+---------+

| Table_locks_immediate | 1151552 |

| Table_locks_waited | 15324 |

+-----------------------+---------+

在 MySQL 3.23.7(在Windows上是3.23.25)以后,在 MyISAM 表中只要没有冲突的 INSERT 操作,就可以无需使用锁表自由地并行执行 INSERT 和 SELECT 语句。也就是说,可以在其它客户端正在读取 MyISAM 表记录的同时时插入新记录。如果数据文件的中间没有空余的磁盘块的话,就不会发生冲突了,因为这种情况下所有的新记录都会写在数据文件的末尾(当在表的中间做删除或者更新操作时,就可能导致空洞)。当空洞被新数据填充后,并行插入特性就会自动重新被启用了。

如果想要在一个表上做大量的 INSERT 和 SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:

 

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> INSERT INTO real_table SELECT * FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;

InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。

行级锁的优点有:

 

在很多线程请求不同记录时减少冲突锁。

事务回滚时减少改变数据。

使长时间对单独的一行记录加锁成为可能。

行级锁的缺点有:

 

比页级锁和表级锁消耗更多的内存。

当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。

当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。

使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。 
 

MySQL优化笔记-整理版

  • 2017年10月21日 21:33
  • 5.69MB
  • 下载

理解MySQL——索引与优化

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将...

mysql参数及其优化

  • 2017年10月11日 16:50
  • 17KB
  • 下载

mysql高级优化 注意超清带目录

  • 2017年11月14日 19:26
  • 70.65MB
  • 下载

MySql+Mybatis+Druid 优化之MyBatis批量删除、更新

业务需求:一次更新/删除多条数据,通常有两种方式:      (1)在业务代码中循环遍历,逐条删除,业务清晰 (2)在sql语句中,循环删除,只操作一次数据库,这个分为两种方式: 方式A:通过循环一个...
  • mayfla
  • mayfla
  • 2017年12月11日 17:04
  • 100

mysql优化笔记(加强版)

  • 2017年11月05日 15:49
  • 15.32MB
  • 下载

mysql优化1

  • 2017年10月26日 16:35
  • 43KB
  • 下载

mysql 查询优化笔记

查询的生命周期:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”是生命周期中最重要的阶段,大量的检索数据到存储引擎的调用以及调用后的数据处理,包括分组排...

Oracle与MySQL数据库索引设计与优化

  • 2017年10月26日 08:53
  • 58.51MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL优化
举报原因:
原因补充:

(最多只允许输入30个字)