MyISAM在某些条件下允许并发插入下读取,并且它让你可以“高度”某些操作,以尽可能少地阻止工作。
MyISAM如何删除和插入行??
删除操作不会重新安排整个表,它们只是把行标记为已经删除,并且在表中留下了一些“洞”。MyISAM在可能的情况下会优先使用这些“洞”,为插入复用空间。如果表是完整的,它就会把新的行拼接在表的最后。
即使MyISAM有表级别的锁,它也能在读取的同时把行拼接到表尾。它通过禁止读取最后一行做到了这一点。这避免了不连续的读取。
但是,当表中间的数据改变的时候,要提供连续读取就困难得多。MVCC是最通用的解决这个问题的方法,它在创建新版本数据的同时提供老版本数据读取。
MyISAM不支持MVCC,所以它只有到达表尾的时候才允许并发插入。
可以使用concurrent_insert变量配置MyISAM的并发插入行为,它有下面的值:
0 MyISAM不允许并发插入,每一次插入都会把表锁住
1 默认值。只要表中没有空缺,MyISAM就允许并发插入
2 该值在MyISAM5.0及更高的版本可用。它强制并发插入到表尾,即使表在空缺也不例外。如果没有线程从表中读取数据,MysQL就会把新数据插入到空缺中。使用了该设置,表的碎片会增多,所以就需要更经常地对表进行优化。
可以配置MySQL把一些操作延迟,然后合并到一起执行。例如,可以使用delay_key_write延迟写入索引。这会带来一些明显的矛盾,立即写入索引(安全但是代价很高),或者等待写入并希望在写入前不要断电(更快,但是如果断电的话就会导致大规模的索引的损坏,因为索引文件已经明显过期了)。也可以使用low_priorite_updates让insert,replace,delete用update比select的优先级更低。这等同于全局地给update使用low_priority修饰符。
MySQL提供了几个语句调节符,允许你修改它的调度策略:
· LOW_PRIORITY关键字应用于DELETE、INSERT、LOAD DATA、REPLACE和UPDATE。
· HIGH_PRIORITY关键字应用于SELECT和INSERT语句。
· DELAYED关键字应用于INSERT和REPLACE语句。
LOW_PRIORITY和HIGH_PRIORITY调节符影响那些使用数据表锁的存储引擎(例如MyISAM和MEMORY)。DELAYED调节符作用于MyISAM和MEMORY数据表。
改变语句调度的优先级
LOW_PRIORITY关键字影响DELETE、INSERT、LOAD DATA、REPLACE和UPDATE语句的执行调度。通常情况下,某张数据表正在被读取的时候,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作)。如果写入者正在等待的时候,另一个读取操作到达了,该读取操作也会被阻塞(block),因为默认的调度策略是写入者优先于读取者。当第一个读取者完成操作的时候,写入者开始操作,并且直到该写入者完成操作,第二个读取者才开始操作。
如果写入操作是一个LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。理论上,这种调度修改暗示着,可能存在LOW_PRIORITY写入操作永远被阻塞的情况。如果前面的读取操作在进行的过程中一直有其它的读取操作到达,那么新的请求都会插入到LOW_PRIORITY写入操作之前。
SELECT查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的SELECT在正常的SELECT语句之前执行,因为这些语句会被写入操作阻塞。
如果你希望所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么请使用--low-priority-updates选项来启动服务器。通过使用INSERT HIGH_PRIORITY来把INSERT语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。
DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候,服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。如果读取者从该数据表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,允许读取者继续操作。当没有读取者的时候,服务器再次开始插入延迟的数据行。这个过程一直进行,直到队列空了为止。
几点要注意事项:· INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED...SELECT语句的DELAYED。· 服务器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE语句的DELAYED。· 因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。· 对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。· DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。
注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。
IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTER TABLE的运行。如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。
insert ignore into tb(...) value(...)
这样不用校验是否存在了,有则忽略,无则添加
分享到:
相关推荐
- **InnoDB**:事务安全,支持行级锁和表级锁,提供多版本并发控制(MVCC),支持外键,适用于事务处理和高并发环境。 - **NDB Cluster**:用于分布式集群,提供高可用性和容错性。 - **MERGE**:合并多个MyISAM...
总结来说,MySQL的高级使用涵盖了索引优化、存储过程的使用、查询缓存的管理、并发控制以及整体性能调优等多个层面。理解并熟练掌握这些知识点,对于提升数据库性能和确保系统稳定运行至关重要。在实际工作中,应...
- **选择合适的存储引擎**:InnoDB适合事务处理,MyISAM适合读密集型应用。 - **数据类型选择**:使用最小的数据类型来存储数据,减少存储空间,提高查询速度。 - **分区和分表**:对于大型表,可以考虑分区或...
InnoDB是MySQL默认的事务处理引擎,支持行级锁定,适合高并发环境。MyISAM则非事务性,但读取速度快,适合读多写少的应用。根据具体需求选择合适的引擎,如需要ACID特性,InnoDB是首选;如果追求高读取速度,可考虑...
MyISAM则在读取密集型应用中表现更佳。 **2.6 架构设计** 合理的架构设计是性能优化的前提。包括但不限于分库分表、读写分离、缓存策略、负载均衡等技术的应用,以及定期的数据库维护和监控。 **2.7 并发控制** ...
MySQL性能调优与架构设计是数据库管理领域中的一个重要主题,特别是在大数据量和高并发的业务场景下,优化MySQL的性能和架构设计对于系统的稳定性和效率至关重要。本资料集围绕这一主题,提供了PDF中文版全册,旨在...
合理的数据分片和分区策略,如垂直分割(将不同业务的数据分散到不同的表或库)、水平分割(通过哈希或范围将数据分布到多个服务器)可以提高并发处理能力和数据读写速度。使用读写分离,将读密集型和写密集型操作...
数据库性能调优是IT行业中一个至关重要的领域,尤其是在大数据量和高并发的业务场景下,对数据库进行优化显得尤为关键。本教程“数据库性能调优.原理与技术”旨在深入探讨这一主题,帮助读者理解并掌握提升数据库...
7. **事务与并发控制**:理解事务的ACID属性,以及MVCC(多版本并发控制)在InnoDB中的实现,对于处理高并发场景至关重要。 8. **备份与恢复**:有效的备份策略能保证数据安全,而快速的恢复机制则能在系统故障后...
数据库性能调优是IT领域中的一个关键话题,特别是在大数据量和高并发的业务环境中,优化数据库性能至关重要。本文将深入探讨“数据库性能调优:原理与技术”这一主题,涵盖数据库设计、查询优化、索引策略、存储优化...
- 支持多线程和高并发操作。 - 高度可靠性。 - 简单易用且高效。 - 开放源代码。 - **MySQL的历史背景与发展** - **起源**: 1985年由David Axmark等人创建的瑞典公司MySQL AB(前身)开发。起初是为了满足内部...
- `innodb_buffer_pool_instances`:增加缓冲池实例的数量可以提高并发性能。 - **MyISAM**: - `key_buffer_size`:该参数用于缓存MyISAM表的索引块,通常设置为可用内存的10%-20%。 - `table_open_cache`:...
- 存储引擎:负责数据的物理存储和访问,如InnoDB、MyISAM等。 - 查询解析器:解析SQL语句,生成执行计划。 - 执行器:根据执行计划进行数据检索或修改操作。 #### 三、Query处理流程 - **接收SQL语句**:...
数据库性能调优是IT领域中的一个关键环节,尤其是在大数据量和高并发的业务场景下,优化SQL语句显得尤为重要。本篇文章将详细讲解在数据库性能优化过程中常用的SQL语句及其应用,帮助你提升数据库的运行效率。 首先...
1. InnoDB与MyISAM:InnoDB支持事务和行级锁定,适合高并发场景;MyISAM速度快但不支持事务,适用于读多写少的应用。 2. TokuDB与InnoDB的对比:TokuDB提供压缩存储,减少磁盘空间,但可能增加CPU开销。 四、性能...
存储引擎的选择,如InnoDB和MyISAM各有优劣,了解它们的特性有助于优化事务处理和读写性能。 其次,数据库架构设计也是本书的重点。这可能包括数据分片、主从复制、读写分离、分布式数据库等高级主题。数据分片可以...
10. **并发控制与事务处理**:MySQL的事务处理机制,如两阶段提交、MVCC(多版本并发控制),以及死锁检测和解决策略,都是保障数据一致性的关键。 11. **安全性与权限管理**:安全是任何数据库系统的重要组成部分...
MyISAM则读取速度快,不支持事务,适用于读多写少的应用。根据业务需求选择合适的存储引擎,可以极大提升数据库性能。 接下来,我们将关注MySQL的配置参数调优。例如,通过调整`innodb_buffer_pool_size`来控制...
例如,InnoDB支持事务处理和行级锁定,适合并发高的环境;MyISAM则速度快但不支持事务,适合读多写少的场景。 5. **架构优化**:根据业务需求,可能需要采用读写分离、分库分表等高级架构来提升系统扩展性。例如,...