了解MYSQL数据库调度和锁定的问题

2008-02-23 07:37:35来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  MySQL允许影响语句的调度特性,这样会使来自几个客户机的查询更好地协作,从而单个客户机不会被锁定太长的时间。更改调度特性还能确保特定的查询处理得更快。我们先来看一下MySQL的缺省调度策略,然后来看看为改变这个策略可使用什么样的选项。出于讨论的目的,假设执行检索( SELECT)的客户机程式为读取程式。执行修改表操作( DELETE,INSERT,REPLACE 或UP DATE)的另一个客户机程式为写入程式。

  MySQL的基本调度策略可总结如下:

  ■ 写入请求应按其到达的次序进行处理。

  ■ 写入具备比读取更高的优先权。

  在表锁的帮助下实现调度策略。客户机程式无论何时要访问表,都必须首先获得该表的锁。能够直接用LOCK TABLES 来完成这项工作,但一般服务器的锁管理器会在需要时自动获得锁。在客户机结束对表的处理时,可释放表上的锁。直接获得的锁可用UNLOCK TABLES 释放,但服务器也会自动释放他所获得的锁。

  执行写操作的客户机必须对表具备独占访问的锁。在写操作进行中,由于正在对表进行数据记录的删除、增加或更改,所以该表处于不一致状态,而且该表上的索引也可能需要作相应的更新。假如表处于不断变化中,此时允许其他客户机访问该表会出问题。让两个客户机同时写同一个表显然不好,因为这样会很快使该表不可用。允许客户机读不断变化的表也不是件好事,因为可能在读该表的那一刻正好正在对他进行更改,其结果是不正确的。执行读取操作的客户机必须有一把防止其他客户机写该表的锁,以确保读表的过程中表不出现变化。但是,该锁无需对读取操作提供独占访问。此锁还允许其他客户机同时对表进行读取。读取不会更改表,任何没必要阻止其他客户机对该表进行读取。

  MySQL允许借助几个查询限修饰符对其调度策略施加影响。其中之一是DELETE、INSERT、LOAD DATA、REPLACE 和UP DATE 语句的LOW_PRIORITY 关键字。另一个是SELECT 语句的HIGH_PRIORITY 关键字。第三个是INSERT 和REPLACE 语句的DELAYED 关键字。

  LOW_PRIORITY 关键字按如下影响调度。一般情况下,假如某个表的写入操作在表正被读取时到达,写入程式被阻塞,直到读取程式完成,因为一旦某个查询开始,就不能中断。假如另一读取请求在写入程式等待时到达,此读取程式也被阻塞,因为缺省的调度策略为写入程式具备比读取程式高的优先级。在第一个读取程式结束时,写入程式继续,在此写入程式结束时,第二个读取程式开始。

  假如写入请求为LOW_PRIORITY 的请求,则不将该写入操作视为具备比读取操作优先级高的操作。在此情形下,假如第二个读取请求在写入程式等待时到达,则让第二个读取操作排在等待的写入操作之前。仅当没有其他读取请求时,才允许写入程式执行。这种调度的更改从理论上说,其含义为LOW_PRIORITY 写入可能会永远被阻塞。当正在处理前面的读取请求时,只要另一个读取请求到达,这个新的请求允许排在LOW_PRIORITY 写入之前。

  SELECT 查询的HIGH_PRIORITY 关键字作用类似。他使SELECT 插在正在等待的写入操作之前,即使该写入操作具备正常的优先级。INSERT 的ELAYED 修饰符作用如下,在表的一个INSERT DELAYED 请求到达时,服务器将相应的行放入一个队列,并立即返回一个状态到客户机程式,以便该客户机程式能够继续执行,即使这些行尚未插入表中。假如读取程式正在对表进行读取,那么队列中的行挂起。在没有读取时,服务器开始开始插入延迟行队列中的行。服务器不时地停下来看看是否有新的读取请求到达,并进行等待。假如是这样,延迟行队列将挂起,并允许读取程式继续。在没有其他的读取操作时,服务器再次开始插入延迟行。这个过程一直进行到延迟行队列空为止。

  此调度修饰符并非出现在任何MySQL版本中。下面的表列出了这些修饰符和支持这些修饰符的MySQL版本。可利用此表来判断所使用的MySQL版本具备什么样的功能:

  INSERT DELAYED 在客户机方的作用

  假如其他客户机可能执行冗长的SELECT 语句,而且您不希望等待插入完成,此时INSERT DELAYED 很有用。发布INSERT DELAYED 的客户机能够更快地继续执行,因为服务器只是简单地将要插入的行插入。但是应该对正常的INSERT 和INSERT DELAYED 性能之间的差异有所认识。假如INSERT DELAYED 存在语法错误,则向客户机发出一个错误,假如正常,便不发出信息。例如,在此语句返回时,不能相信所取得的AUTO_INCREMENT 值。也得不到惟一索引上的重复数目的计数。之所以这样是因为此插入操作在实际的插入完成前返回了一个状态。其他还表示,假如INSERT DELAYED 语句的行在等待插入中被排队,并且服务器崩溃或被终止(用kill -9),那么这些行将丢失。正常的TERM 终止不会这样,服务器会在退出前将这些行插入。

  


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: MySQL数据库中用GRANT语句增添新用户

下一篇: 如何提高MySQL性能