• MyISAM存储引擎的表级锁定优化


    MySQL支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB 表进行行级锁定。
    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
    MySQL的表级锁有两种模式:表共享读锁和表独占写锁。对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
    对于大表,对于大多数应用程序,表锁定比行锁定更好,但存在部分缺陷。表锁定使许多线程同时从一个表中进行读取操作,但如果一个线程想要对表进行写操作,它必须首先获得独占访问。更新期间,所有其它想要访问该表的线程必须等待直到更新完成。
    针对MyISAM存储引擎的表级锁定特点:
    1、减小sql语句的执行时间;
    2、数据表的索引保证合理高效;
    3、设置SELECT语句优于更新操作(INSERT,UPDATE,DELETE)执行,降低写操作的优先权;
       通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

       通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。

       通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

    4、使用临时表提高查询性能;
       查询数据较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果放到临时表中,这样就可以很快释放Mysql的表锁;
    5、表结构设计,尽量避免同一表有大量更新与查询混在一起,合理进行拆表;
    6、表存在结合大量INSERT和SELECT操作时,选择支持并发的SELECT和INSERT操作。

       MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
       当concurrent_insert设置为0时,不允许并发插入。
       当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
       当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。

  • 相关阅读:
    codeforces 587B
    codeforces 552E
    算法竞赛模板 字典树
    算法竞赛模板 二叉树
    算法竞赛模板 图形面积计算
    TZOJ 1545 Hurdles of 110m(动态规划)
    算法竞赛模板 判断线段相交
    算法竞赛模板 折线分割平面
    TZOJ 3005 Triangle(判断点是否在三角形内+卡精度)
    算法竞赛模板 KMP
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4429551.html
Copyright © 2020-2023  润新知