mysql的myisam存储引擎特性(三)

 

 

7.改变语句调度的优先级

 

   MySQL 还允许改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。

  我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。

  下面我们提到的改变调度策略的方法主要是针对 MyISAM 存储引擎的,对于 InnoDB 存储引擎,语句的执行是由获得行锁的顺序决定的。

 

MySQL 的默认的调度策略可用总结如下:

  •  写入操作优先于读取操作。
  •  对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。
  •  对某张数据表的多个读取操作可以同时地进行。

MySQL 提供了几个语句调节符,允许你修改它的调度策略:

  •  LOW_PRIORITY 关键字应用于 DELETE 、 INSERT 、 LOAD DATA 、 REPLACE 和 UPDATE 。
  •  HIGH_PRIORITY 关键字应用于 SELECT 和 INSERT 语句。
  •  DELAYED 关键字应用于 INSERT 和 REPLACE 语句。

如果写入操作是一个 LOW_PRIORITY  (低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到 写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度修改可能存在 LOW_PRIORITY 写入操作永远被阻塞的情况。

SELECT 查询的 HIGH_PRIORITY (高优先级)关键字也类似。它允许 SELECT  插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的 SELECT 在正常的 SELECT  语句之前执行,因为这些语句会被写入操作阻塞。

如果你希望所有支持 LOW_PRIORITY 选项的语句都默认地按照低优先级来处理,那么请使用  --low-priority-updates 选项来启动服务器。通过使用 INSERT HIGH_PRIORITY 来把 INSERT  语句提高到正常的写入优先级,可以消除该选项对单个 INSERT 语句的影响。

 

下面测试一下LOW_PRIORITY 的功能:

 

session 1:将表以read local的形式锁住

mysql>  lock table t read local;
Query OK, 0 rows affected (0.00 sec)

 

session 2:

这时正常的插入一条数据是可以的,不过以low priority插入数据会被阻止,直到unlock table后session 2的新数据才被插入数据库。

mysql>  insert into t values(22);
Query OK, 1 row affected (5.51 sec)

mysql> insert into t values(22);
Query OK, 1 row affected (0.00 sec)

mysql> insert low_priority into t values(23);

hang住了

 

再来测试一下DELAYED 关键字,我们知道正常情况下表加上write锁时,其它的session是不能够插入数据和读数据的,而加上depayed关键字后则可以对write锁的表进行插入操作了。

session 1:

mysql>  lock table t write;
Query OK, 0 rows affected (0.00 sec)

session 2:

mysql> insert delayed into t values(23);
Query OK, 1 row affected, 1 warning (0.01 sec)

下面是关于delayed的参数及变量:

mysql> show global variables like '%delayed%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| delayed_insert_limit       | 100   |
| delayed_insert_timeout     | 300   |
| delayed_queue_size         | 1000  |
| max_delayed_threads        | 20    |
| max_insert_delayed_threads | 20    |
+----------------------------+-------+
5 rows in set (0.00 sec)

mysql> show status like '%delayed%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Delayed_errors           | 0     |
| Delayed_insert_threads   | 0     |
| Delayed_writes           | 5     |
| Not_flushed_delayed_rows | 0     |
+--------------------------+-------+
4 rows in set (0.00 sec)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值