最近服务器上经常出现mysql进程占CPU100%的情况,使用show processlist命令后,看到出现了很多状态为LOCKED的sql。使用show status like 'table%'检查Table_locks_immediate和Table_locks_waited,发现Table_locks_waited偏 大。出问题的表是MyISAM,分析大概是MyISAM的锁表导致。
MyISAM适合于读频率远大于写频率这一情况。而我目前的应用可能会出现在某一时段读写频率相当。大致如下:
- 一个客户端发出需要长时间运行的SELECT
- 其他客户端在同一个表上发出INSERT或者UPDATE,这个客户将等待SELECT完成
- 另一个客户在同一个表上发出另一个SELECT;因UPDATE或INSERT比SELECT有更高有优先级,该SELECT将等待UPDATE或INSERT完成,也将等待第一个SELECT完成
也就是说对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write
Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write
Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
解决方案大概有如下几种:
- MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
- 0 不允许并发操作
- 1 如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
- 2 无论MyISAM表中有没有空洞,都允许在表尾并发插入记录
- 使用--low-priority-updates启用mysqld。这将给所有更新(修改)一个表的语句以比SELECT语句低的优先级。在这种情况下,在先前情形的最后的SELECT语句将在INSERT语句前执行。
- 为max_write_lock_count设置一个低值,使得在一定数量的WRITE锁定后,给出READ锁定
- 使用LOW_PRIORITY属性给于一个特定的INSERT,UPDATE或DELETE较低的优先级
- 使用HIGH_PRIORITY属性给于一个特定的SELECT
- 使用INSERT DELAYED语句
相关推荐
其中,存储引擎是专门处理表数据的模块,不同类型的存储引擎决定了数据的存储格式、索引类型以及并发控制策略。 MySQL提供了多种存储引擎,常见的如MyISAM和InnoDB。MyISAM是早期常用的引擎,它支持表级锁定,这...
1. 表锁:在MyISAM和InnoDB引擎中都支持,优点是加锁速度快,开销小,但锁定粒度大,容易造成锁冲突,适用于更新大量数据或涉及多表操作的复杂业务逻辑。 2. 页面锁:仅BDB引擎支持,锁定粒度介于表锁和行锁之间,...
数据库分表处理是一种应对高负载环境下数据库压力的有效策略。在大数据量的情况下,单表操作可能导致锁表、阻塞,严重影响数据库性能和用户体验。为了解决这些问题,分表技术应运而生,通过将数据分散到多个表中,...
- **MyISAM表锁:** MyISAM存储引擎使用表级锁。在并发读取时表现良好,但在并发插入时性能较差。如果插入发生在表的末尾,则可以支持一定程度的并发。 - **SQL Server的页锁和行锁:** SQL Server早期版本使用页锁...
- 添加合适索引、减少返回数据、分批处理、优化SQL结构、采用读写分离等都是优化方法。 - 使用`EXPLAIN`查看执行计划,理解`type`、`key`、`rows`等字段含义,有助于优化SQL性能。 4. **分库分表设计**: - 水平...
- **基础描述**:MyISAM是MySQL早期版本的默认存储引擎,不支持事务处理和行级锁,但提供了全文索引支持。 - **特点描述**: - **锁表机制**:在读取数据时使用共享锁,在写入数据时使用排他锁。 - **全文索引**...
- MyISAM采用表级锁,InnoDB支持行级锁。 - MyISAM不存储行数,InnoDB可以存储行数。 - MyISAM索引是非聚集的,InnoDB主键索引是聚集的。 4. **InnoDB的事务隔离级别** - **读未提交(READ UNCOMMITTED)**:...
InnoDB的行级锁定相比MyISAM的表级锁定可以提高并发处理能力,因为它只锁定需要操作的数据行,从而减少了数据操作的冲突。 #### 5. 如何在线添加索引而不影响读写操作? TokuDB存储引擎支持在线添加索引,能够在不...
总的来说,MySQL数据库原理及设计方法涉及到网络通信、查询优化、并发控制、事务处理等多个层面,理解这些知识对于有效地使用和管理MySQL数据库至关重要。通过合理的设计和配置,可以确保MySQL在高并发环境下提供...
- 锁机制:InnoDB支持行级锁,MyISAM支持表级锁。 - MVCC:InnoDB支持,MyISAM不支持。 - 外键:InnoDB支持,MyISAM不支持。 - 全文索引:MyISAM支持,InnoDB早期版本不支持,但现在可以通过插件实现。 6. 数据...
MySQL是世界上最流行的关系型数据库管理系统之一,其面试题通常涵盖了广泛的知识点,包括数据库的基础知识、索引、事务处理、锁机制以及性能优化等。以下是对这些知识点的详细阐述: 一、基础知识 1. MySQL的体系...
- **Sql Layer**:处理SQL逻辑,包括初始化、核心API、网络交互、客户端协议、用户管理和权限控制、访问控制、连接管理、查询解析、查询缓存、优化、表管理、系统状态维护等。 - **存储引擎层**:实际执行数据操作...
而MyISAM则不支持事务,只支持表级锁,但是MyISAM在性能上有优势,并且支持全文索引(FULLTEXT)。在MySQL 5.5.5版本之后,InnoDB成为了默认的存储引擎。 设置表级别的存储引擎,可以在创建表时,通过 ENGINE=存储...
常见的存储引擎有InnoDB(事务处理,支持行级锁)和MyISAM(非事务处理,速度快)。客户端则通过各种接口(如ODBC、JDBC或命令行)与服务器通信。 3. **日志实现**:MySQL的日志系统包括二进制日志(Binary Log)和...
本文将详细分析MySQL表中碎片产生的原因,并且介绍相应的清理方法。 首先,了解MySQL存储引擎是很重要的。MySQL支持多种存储引擎,常见的有InnoDB和MyISAM。不同存储引擎在处理碎片方面有不同的机制和操作方式。 ...
- 预处理器:检查解析树的合法性,处理表和列的存在性,生成最终解析树。 - 查询优化器:根据解析树选择最优的执行计划,包括静态和动态优化。 4. 查询执行引擎:执行查询计划,涉及索引查找、数据读取、锁管理等...
MySQL 存储引擎是负责处理表的创建、读取、更新和删除操作的组件。常见的 MySQL 存储引擎包括 InnoDB、MyISAM、Memory、Archive 和 CSV 等。 * InnoDB:InnoDB 是 MySQL 的默认存储引擎,它支持事务、行级锁和外键...
然而,在执行大量数据插入操作时,MyISAM可能表现得更快,因为它使用表级锁定,这在插入顺序进行时可以减少锁等待时间。 为了更准确地评估这两种存储引擎在批量数据插入时的性能表现,可以通过以下步骤来进行测试:...
此外,还有按粒度划分的锁,如表级锁和行级锁,以及InnoDB的Gap锁和Next-key Lock,用于处理并发控制和幻读问题。 7. **死锁处理**:解决死锁的方法包括预检测死锁和设置锁等待超时。一旦检测到死锁,系统可以回滚...
3. 锁机制上,`MyISAM`使用表级锁定,意味着在查询期间整个表可能会被锁定,可能导致并发性能下降。相反,`InnoDB`使用行级锁定,允许更高的并发性能,尤其是在多用户环境中。 4. 其他区别还包括崩溃恢复能力,`...