`

关于mysql myisam 表并发

阅读更多

MyISAM的锁调度


前面讲过,MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM的调度行为。

¡  通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

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

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

虽然上面3种方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。

另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。

上面已经讨论了写优先调度机制带来的问题和解决办法。这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”!因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行。

 


了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:

concurrent_insert:

通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:

当concurrent_insert=0时,不允许并发插入功能。

当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。

当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。

这样看来,把concurrent_insert设置为2是很划算的,至于由此产生的文件碎片,可以定期使用OPTIMIZE TABLE语法优化。

max_write_lock_count:

缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求。此时可以考虑使用max_write_lock_count:

max_write_lock_count=1

有了这样的设置,当系统处理一个写操作后,就会暂停写操作,给读操作执行的机会。

low-priority-updates:

我们还可以更干脆点,直接降低写操作的优先级,给读操作更高的优先级。

low-priority-updates=1

综合来看,concurrent_insert=2是绝对推荐的,至于max_write_lock_count=1和low-priority-updates=1,则视情况而定,如果可以降低写操作的优先级,则使用low-priority-updates=1,否则使用max_write_lock_count=1。

分享到:
评论

相关推荐

    mysql的myisam解决并发读写解决方法

    ### MySQL的MyISAM表类型解决并发读写问题 在MySQL数据库系统中,MyISAM是一种非常常用的存储引擎。它以其高效性和简单的结构而在许多场景下得到广泛应用,尤其是在那些读取操作远多于写入操作的应用场景中。然而,...

    Mysql(MyISAM)的读写互斥锁问题的解决方法

    "Mysql(MyISAM)的读写互斥锁问题的解决方法" 在Mysql(MyISAM)中,读写互斥锁问题是常见的性能瓶颈之一。为了解决这个问题,需要了解MyISAM的读写机制和锁机制。MyISAM在读操作占主导的情况下是很高效的,但是一旦...

    MyISAM引擎与InnoDB引擎性能的对比

    MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...

    MySQL大并发量性能优化实战

    MyISAM则读取速度快但不支持事务,适用于只读或并发较低的场景。根据实际需求选择合适的存储引擎。 5. **连接池管理**:合理设置数据库连接池大小,避免过多连接导致资源浪费。同时,定期清理无效连接,保持连接池...

    MySQL MyISAM默认存储引擎实现原理

    MyISAM是MySQL的默认存储引擎之一,它在磁盘上存储表数据的方式独具特色。每个MyISAM表由三个文件组成: 1. `.frm` 文件:存储表的结构信息,包括字段定义、索引定义等。 2. `.MYD` 文件:存储实际的数据记录,即...

    mysql高级笔记,mysql索引、存储过程、查询缓存、并发参数调整、MyISAM表锁、系统性能优化

    本笔记将深入探讨MySQL的几个关键高级主题,包括索引、存储过程、查询缓存、并发参数调整、MyISAM表锁以及系统性能优化策略。 首先,我们来讨论**MySQL索引**。索引是提高查询速度的关键,它在数据库中的作用类似于...

    mysql DB引擎myisam与innodB

    ### MySQL 数据库引擎 MyISAM 与 InnoDB 在 MySQL 数据库系统中,存在多种不同的存储引擎,其中最为人所熟知且广泛使用的两种是 MyISAM 和 InnoDB。这两种存储引擎各自具有独特的特点和适用场景。 #### InnoDB:...

    mysql myisam 优化设置设置

    通过上述优化设置,可以显著提升MySQL MyISAM表的性能,特别是在处理大量数据时。然而,值得注意的是,随着InnoDB存储引擎的普及,由于其支持事务处理和行级锁定,现在更推荐使用InnoDB,尤其是在高并发环境下。但在...

    MySQL大表性能优化方案 和 MySQL高性能表设计规范

    在数据库管理领域,MySQL是广泛使用的开源关系型数据库系统,尤其在处理大数据量时,其性能优化和高效表设计显得尤为重要。本篇文章将深入探讨针对MySQL大表的性能优化策略以及如何遵循高性能的表设计规范。 一、...

    MySQL存储引擎之争-InnoDB与MyISAM全面对决

    相对地,MyISAM采用表级锁,一旦有查询需要锁定整个表,其他所有线程都将被阻塞,这限制了其并发处理能力。 在存储空间占用方面,InnoDB由于需要记录事务日志和维护行级锁信息,通常会占用更多的磁盘空间。然而,...

    MyISAM和InnoDB的异同

    MyISAM支持表级锁定,这意味着当一个表被用于写入操作时,整个表都会被锁定,直到该操作完成。这会导致其他查询或更新操作必须等待当前操作完成才能继续执行。尽管这种机制可能会降低并发性能,但在以读取为主的环境...

    Mysql 教程 - MySql 工具.pdf

    myisamchk 是 MySQL 官方提供的工具,用于 MyISAM 表维护。 4. 显示 MyISAM 日志文件内容: myisamlog myisamlog 是 MySQL 官方提供的工具,用于显示 MyISAM 日志文件内容。 5. 产生压缩,只读 MyISAM 表: ...

    mysql中的表引擎

    MyISAM使用表级锁定,这意味着在数据修改期间,整个表可能会被锁定,可能导致并发性能下降。但它不支持事务处理,因此不适合需要高度一致性的应用。 3. **ISAM** 是较早的MySQL引擎,主要用于简单查询,不支持事务...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    MySQL存储引擎--MyISAM与InnoDB区别 MySQL是一种关系型数据库管理系统,它支持多种存储引擎,每种存储引擎都有其特点和优缺。MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM...

    Mysql 表类型(存储引擎)

    - MyISAM使用表级锁定,意味着在写操作时整个表会被锁定,可能影响并发性能。 - MyISAM不支持外键,因此在多表关联和数据完整性的维护上不如InnoDB。 3. **Memory(Heap)** - Memory存储引擎将表数据保存在内存...

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    18. **.frm、.myi、.myd、.ibd文件**:这些是MySQL数据文件,分别存储表定义、MyISAM表索引、MyISAM表数据和InnoDB表数据。 19. **表数据删掉一半,文件大小不变**:因InnoDB使用行级锁定,删除数据不会立即释放...

    MYSQL 解锁与锁表介绍

    比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但...

    MySQL Example Databases(world database MyISAM version)

    它包含了一些关于世界各国及其城市的统计数据,这些数据可以帮助我们理解和学习如何在MySQL中进行数据操作、查询以及关系数据库管理。 该数据库使用的是MyISAM存储引擎,这是MySQL早期版本中常用的非事务处理引擎,...

Global site tag (gtag.js) - Google Analytics