今天我们来简单总结一下mysql的锁机制。如果不合适,欢迎拍砖!
1.对于MySQL,有三个级别的锁:页面级、表级和行级。
页面级的典型代表引擎是BDB。
表格的典型代表引擎是米沙姆,内存和ISAM很久以前。
级别的典型代表引擎是INNODB。
2.线锁是我们实际应用中最常用的一种。
行锁的优点如下:
1)当许多连接分别进行不同的查询时,减少锁定状态。
2)在异常情况下,可以减少数据丢失。因为一次只能回滚一行或几行小数据。
行锁的缺点如下:
1)它比页级锁和表级锁占用更多内存。
2)查询时比页级锁和表级锁需要更多的I/O,所以我们经常使用行级锁进行写操作,而不是读操作。
3)、容易出现死锁。
3.MySQL使用写队列和读队列来读写数据库。
写锁定如下:
1),如果表没有被锁定,那么给它添加一个写锁。
2)否则,将请求放入写锁队列中。
读取锁定如下所示:
1).如果表没有写锁,则添加一个读锁。
2)否则,将请求放入读锁队列中。
当然,我们可以使用low_priority和high_priority来分别改变写和读操作中的这些行为。
4.让我用一个简单的例子来解释上面的陈述。
让我们运行一个长查询。
1)客户端1:
mysql & gtselect count(*)from content group by content;
...
客户2:
mysql & gtupdatecontent set content = '我爱你'其中id = 444
查询正常,1行受影响(30.68秒)
匹配的行数:1已更改:1警告数:0
花了半分钟。
2)我们现在终止客户端1。
此时,客户端2:
mysql & gtupdatecontent set content = '我恨你'其中id = 444
查询正常,1行受影响(0.02秒)
匹配的行数:1已更改:1警告数:0
只用了20毫秒。
这个例子很好地说明了读写队列的操作。
对于1中的客户端1,此时表上没有锁,当然也没有写锁,所以客户端1此时在表上添加了读锁。
对于1中的客户机2,此时,因为表有一个读锁,所以更新请求被放入写锁队列中。
当释放读锁时,即当SHOW PROCESSLIST中的状态为COPY TO TMP TABLE时,更新操作开始。
5.您可以在复制中对主服务器和从服务器使用不同的锁,以使系统达到最佳性能。(当然这个前提是所有SQL语句都是最优的。)
关键词:摘要、机制、教程、客户端
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227245.html