我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。
下面我们提到的改变调度策略的方法主要是针对 MyISAM 存储引擎的,对于 InnoDB 存储引擎,语句的执行是由获得行锁的顺序决定的。
MySQL 的默认的调度策略可用总结如下:
- 写入操作优先于读取操作。
- 对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。
- 对某张数据表的多个读取操作可以同时地进行。
MySQL 提供了几个语句调节符,允许你修改它的调度策略:
- [cci lang='mysql' ]LOW_PRIORITY[/cci] 关键字应用于 [cci lang='mysql' ]DELETE[/cci] 、[cci lang='mysql' ] INSERT [/cci]、[cci lang='mysql' ] LOAD DATA[/cci] 、 [cci lang='mysql' ]REPLACE[/cci] 和 [cci lang='mysql' ]UPDATE[/cci] 。
- [cci lang='mysql' ]HIGH_PRIORITY[/cci] 关键字应用于[cci lang='mysql' ] SELECT[/cci] 和[cci lang='mysql' ] INSERT [/cci]语句。
- [cci lang='mysql' ]DELAYED[/cci] 关键字应用于 [cci lang='mysql' ]INSERT[/cci] 和 [cci lang='mysql' ]REPLACE[/cci] 语句。
如果写入操作是一个 [cci lang='mysql' ]LOW_PRIORITY [/cci](低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度修改可能存在 [cci lang='mysql' ]LOW_PRIORITY[/cci] 写入操作永远被阻塞的情况。
[cci lang='mysql' ]SELECT 查询的 HIGH_PRIORITY[/cci] (高优先级)关键字也类似。它允许[cci lang='mysql' ] SELECT [/cci]插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的 [cci lang='mysql' ]SELECT[/cci] 在正常的[cci lang='mysql' ] SELECT [/cci]语句之前执行,因为这些语句会被写入操作阻塞。
如果你希望所有支持 [cci lang='mysql' ]LOW_PRIORITY [/cci]选项的语句都默认地按照低优先级来处理,那么请使用 [cci lang='mysql' ]--low-priority-updates[/cci] 选项来启动服务器。通过使用 [cci lang='mysql' ]INSERT HIGH_PRIORITY[/cci] 来把 INSERT[/cci] 语句提高到正常的写入优先级,可以消除该选项对单个[cci lang='mysql' ] INSERT[/cci] 语句的影响。
No comments:
Post a Comment