mysql中update的low_priority

low_priority,低优先级
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,…

mysql中update用low_priority让update不锁定表

MySQL允许你改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。这一部分讲解MySQL的默认的调度策略和可以用来影响这些策略的选项。它还谈到了并发性插入操作的使用和存储引擎锁定层次对客户端的并发性的影响。为了讨论的方便,我们把执行检索(SELECT)的客户端称为"读取者",把执行修改操作(DELETE、INSERT、REPLACE或UPDATE)的客户端称为"写入者"。

(在不要求实时的情况下,写入可以降低跟新插入操作的优先级,确保读的速度。当然,也有更好的方法来完成这个目的,主从,中间缓存,都可以。)

 

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

· 写入操作优先于读取操作。

· 对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。

· 对某张数据表的多个读取操作可以同时地进行。

 

MyISAM和MEMORY存储引擎借助于数据表锁来实现这样的调度策略。当客户端访问某张表的时候,首先必须获取它的锁。当客户端完成对表的操作的时候,锁就会被解除。通过LOCK TABLES和UNLOCK TABLES语句来显式地获取或释放锁是可行的,但是在通常情况下,服务器的锁管理器会自动地在需要的时候获取锁,在不再需要的时候释放锁。获取的锁的类型依赖于客户端是写入还是读取操作。

对某张表进行写入操作的客户端必须拥有独占的(排他的)访问权的锁。操作在进行的过程中,该数据表处于不一致的(inconsistent)状态,因为数据记录在删除、添加或修改的时候,数据表上的索引也可能需要更新以相互匹配。这个数据表在变化的过程中,如果允许其它的客户端访问,会出现问题。非常明显,允许两个客户端同时写入一张数据表是不利的,因为这样的操作会很快使数据表中的信息成为一堆无用的垃圾。但是允许客户端读取变化之中的数据表也不好,因为正在读取的位置中的数据可能正在变化(修改),读取的结果可能不是真实的。

对某张表执行读取操作的客户端必须获取一个锁,防止在读取的过程中,其它的客户端写入或改变表。但是这个锁不需要独占的访问权。读取操作不会改变数据,因此没有理由让某个读取者阻止其它的读取者访问这张表。因此读取锁允许其它的客户端在同一时刻读取这张表。

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

· LOW_PRIORITY关键字应用于DELETE、INSERT、LOAD DATA、REPLACE和UPDATE。

· HIGH_PRIORITY关键字应用于SELECT和INSERT语句。

· DELAYED关键字应用于INSERT和REPLACE语句。

LOW_PRIORITY和HIGH_PRIORITY调节符影响那些使用数据表锁的存储引擎(例如MyISAM和MEMORY)。DELAYED调节符作用于MyISAM和MEMORY数据表。

改变语句调度的优先级

LOW_PRIORITY关键字影响DELETE、INSERT、LOAD DATA、REPLACE和UPDATE语句的执行调度。通常情况下,某张数据表正在被读取的时候,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作)。如果写入者正在等待的时候,另一个读取操作到达了,该读取操作也会被阻塞(block),因为默认的调度策略是写入者优先于读取者。当第一个读取者完成操作的时候,写入者开始操作,并且直到该写入者完成操作,第二个读取者才开始操作。

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

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

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

 

时间: 2024-10-26 05:46:50

mysql中update的low_priority的相关文章

MySQL中UPDATE语句使用的实例教程_Mysql

一.UPDATE常见用法首先建立测试环境:   DROP TABLE IF EXISTS t_test; CREATE TABLE t_test ( bs bigint(20) NOT NULL auto_increment, username varchar(20) NOT NULL, password varchar(20) default NULL, remark varchar(200) default NULL, PRIMARY KEY (bs) ) ENGINE=InnoDB AUT

MySQL中UPDATE与DELETE语句的使用教程_Mysql

UPDATE 更新UPDATE SET 语法用于修改更新数据表中的数据. 语法: UPDATE tb_name SET column1 = new_value1,column2 = new_value2,- WHERE definition 该语法将数据表中符合 WHERE 条件的记录中的 column1 的值更新为 new_value1,column2 的值更新为 new_value2 ,以此类推.如果省略 WHERE 条件,则会将表中所有记录的 column 值进行更新. 例子: <?php

MySQL中Update与Insert语句用法详解

MySQL 更新数据 Update 语句 update 语句的定义: UPDATE语法可以用新值更新原有表行中的各列.让我们先来看一下update语句标准的定义,放在[]内的都是可以省略的:  代码如下 复制代码 UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] s

mysql中update批量修改与替换语句

MySQL批量替换指定字段字符串语句 UPDATE 数据表名 SET 字段名 = replace(字段名, '要替换的字符串', '替换为') WHERE 设定条件; 例子  代码如下 复制代码 UPDATE `cdb_name` SET `field_name` = replace (`field_name`,'from_str','to_str') 说明: cdb_name -- 该字符或字符串所在表的名字 field_name -- 该字符或字符串所在字段的字段名 from_str --

mysql中UPDATE批量替换语句

人肉更新是一件非常恐怖的事情. 于是搜了一下使用Mysql批量替换字段的方法! 1. 使用Phpmyadmin进入数据库管理, 搜索http://wenwen.soso.com, 你就可以看到哪些表里面包含了这个字段. 2. 点击SQL, 执行SQL语句:  代码如下 复制代码 UPDATE '表名' SET '字段' = REPLACE('字段','待替换内容','替换值'); 示例:update `crowd_url_soso` set url=replace(url,'http://wen

php+MySQL判断update语句是否执行成功的方法_php技巧

update语句是PHP+MySQL中常用的操作,判断update语句是否执行成功是其中非常重要的一个环节.本文就以实例展示了php+MySQL判断update语句是否执行成功的方法.分享给大家供大家参考之用.具体方法如下: 代码一: $rs=MySQL_query($sql); if(mysql_affected_rows()) echo "sql执行成功"; else echo "sql执行失败"; 代码二: <?php /* 连接数据库 */ mysql

mysql中You can’t specify target table for update in FROM clau

 mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中). 例如下面这个sql: 代码如下: delete from tbl where id in  (         select max(id) from tbl a where EXISTS         (             select 1 from tbl b whe

mysql中You can’t specify target table for update in FROM clause错误解决方法_Mysql

mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中). 例如下面这个sql: 复制代码 代码如下: delete from tbl where id in (         select max(id) from tbl a where EXISTS         (             select 1 from tbl b

关于MYSQL DML(UPDATE DELETE)中的子查询问题和ERROR 1093 (HY000)错误

从5.6开始MYSQL的子查询进行了大量的优化,5.5中只有EXISTS strategy,在5.7中包含如下: IN(=ANY) --Semi-join   --table pullout(最快的,子查询条件为唯一键)   --first match   --semi-join materialization   --loosescan   --duplicateweedout --Materialization --EXISTS strategy(最慢的) NOT IN( <>ALL) -