主页 > 知识库 > 数据库 > MySQL >

mysql查询更新时的锁表机制分析(2)

来源:中国IT实验室 作者:佚名 发表于:2013-07-01 10:24  点击:
b、当用客户端1进行一个较长时间的更新操作时,用客户端2,3分别进行读写操作: client1: mysql update gz_phone set phone=11111111111; Query OK, 1671823 rows affected (3 min 4.03 sec) Rows matched: 2212070

b、当用客户端1进行一个较长时间的更新操作时,用客户端2,3分别进行读写操作:
  client1:
  mysql> update gz_phone set phone=’11111111111′;
  Query OK, 1671823 rows affected (3 min 4.03 sec)
  Rows matched: 2212070 Changed: 1671823 Warnings: 0
  client2:
  mysql> select id,phone,ua,day from gz_phone limit 10;
  +----+-------+-------------------+------------+
  | id | phone | ua | day |
  +----+-------+-------------------+------------+
  | 1 | 2222 | SonyEricssonK310c | 2007-12-19 |
  | 2 | 2222 | SonyEricssonK750c | 2007-12-19 |
  | 3 | 2222 | MAUI WAP Browser | 2007-12-19 |
  | 4 | 2222 | Nokia3108 | 2007-12-19 |
  | 5 | 2222 | LENOVO-I750 | 2007-12-19 |
  | 6 | 2222 | BIRD_D636 | 2007-12-19 |
  | 7 | 2222 | SonyEricssonS500c | 2007-12-19 |
  | 8 | 2222 | SAMSUNG-SGH-E258 | 2007-12-19 |
  | 9 | 2222 | NokiaN73-1 | 2007-12-19 |
  | 10 | 2222 | Nokia2610 | 2007-12-19 |
  +----+-------+-------------------+------------+
  10 rows in set (2 min 58.56 sec)
  client3:
  mysql> update gz_phone set phone=’55555′ where id=1;
  Query OK, 1 row affected (3 min 50.16 sec)
  Rows matched: 1 Changed: 1 Warnings: 0
  说明当数据表有一个写锁时,其它进程的读写操作都需等待读锁释放后才会执行。
  3、并发插入
  原则上数据表有一个读锁时,其它进程无法对此表进行更新操作,但在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
  MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
  a、当concurrent_insert设置为0时,不允许并发插入。
  b、当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
  c、当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
  4、MyISAM的锁调度
  由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
  我们可以通过一些设置来调节MyISAM的调度行为:
  a、通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
  b、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
  c、通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
  上面3种方法都是要么更新优先,要么查询优先的方法。这里要说明的就是,不要盲目的给mysql设置为读优先,因为一些需要长时间运行的查询操 作,也会使写进程“饿死”。只有根据你的实际情况,来决定设置哪种操作优先。这些方法还是没有从根本上同时解决查询和更新的问题。
  在一个有大数据量高并发表的mysql里,我们还可采用另一种策略来进行优化,那就是通过mysql主从(读写)分离来实现负载均衡,这样可避免优先哪一种操作从而可能导致另一种操作的堵塞。

有帮助
(0)
0%
没帮助
(0)
0%