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

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表中有没有空洞,都允许在表尾并发插入记录。

时间: 2024-10-30 04:37:00

MyISAM存储引擎的表级锁定优化的相关文章

【Mysql 学习】MyISAM存储引擎(一)。

MyISAM是默认存储引擎. 每个MyISAM在磁盘上存储成三个文件. 第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex). 想要用一个MyISAM表格,可以使用如下语句: CREATE TABLE t (i INT) ENGINE = MYISAM; 一般地,ENGINE选项是不必要的:除非默认已经被改变了,MyISAM是默认存储引擎. 如下是MyISAM存储引擎的一些特征

MySQL的MyISAM存储引擎修复及修改最大文件大小

前两天生产库上出现了一个不大不小的故障,关于MySQL 的存储引擎问题. 这个故障所涉及到的是MySQL 4.1.20的版本MyISAM存储引擎,一张1千多万的表. 故障现象: 在做简单的SELECT查询的时候没有问题,但是做连接查询或者其他复杂查询的时候就报错了:具体的错误代码由于时间的问题被遗忘了.在系统日志中记录的错误如下图: 从错误信息中可以猜到了大概:存储引擎出了问题. 进到相应的数据库目录下,查看一下数据文件大小,有4G大小,这就不奇怪了. MySQL 4版本的数据库创建的表默认最大

MySQL数据库MyISAM存储引擎转为Innodb的方法_Mysql

mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb.步骤如下: 1.导出CentOS数据库的表结构 复制代码 代码如下: mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构 2.替换centos_table.sql里的MyISAM为INNODB 复制代码 代码如下:

浅谈MySql的存储引擎(表类型) (转)

什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等.根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有区别又有共同点. MySql数据库是开放源代码的关系型数据库.目前,它可以提供的功能有:支持sql语言.子查询.存储过程.触发器.视图.索引.事务.锁.外

浅谈MySql的存储引擎(表类型)_Mysql

什么是MySql数据库     通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合.    我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等.根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有区别又有共同点.    MySql数据库是开放源代码的关系型数据库.目前,它可以提供的功能有:支持sql语言.子查询.存储过程.触发器.视图

MYSQL 浅谈MyISAM 存储引擎_Mysql

思维导图      介绍          mysql中用的最多存储引擎就是innodb和myisam.做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对<高性能MYSQL>书中提到的myisam的理解,请大家多多指教.    特点   > 不支持事务     证明如下:      >> 表记录:t2表的engine是myisam.       >> 操作 注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否

mysql查看表的存储引擎、表结构等相关信息

以下均为查看mytable表的信息 1.查看表的存储引擎.记录数等 mysql> show table status like 'mytable' /G;*************************** 1. row *************************** Name: mytable #表名 Engine: InnoDB #存储引擎伟InnoDB Version: 10 #mysql版本 Row_format: Compact #行格式.有Dynamic,fixed,Com

MYSQL 浅谈MyISAM 存储引擎

思维导图    介绍        mysql中用的最多存储引擎就是innodb和myisam.做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对<高性能MYSQL>书中提到的myisam的理解,请大家多多指教.  特点 > 不支持事务   证明如下:     >> 表记录:t2表的engine是myisam. >> 操作 注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务.>> 下面请

【Mysql 学习】MyISAM存储引擎(二)。

MyISAM表的存储格式 1. 静态(固定长度)表特征 2. 动态表特征 3. 已压缩表特征   MyISAM支持三种不同存储格式.其中两个(固定格式和动态格式)根据正使用的列的类型来自动选择.第三个,即已压缩格式,只能使用myisampack工具来创建.    当CREATE或ALTER一个没有BLOB或TEXT列的表,可以用ROW_FORMAT表选项强制表的格式为FIXED或DYNAMIC.这会导致CHAR和VARCHAR列因FIXED格式变成CHAR,或因DYNAMIC格式变成VARCHA