赞
踩
优化措施:
开启慢查询日志命令
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
$ sudo tail -f /var/log/mysql/mysql-slow.log
使用 EXPLAIN 命令可以分析 SELECT 查询语句,得到查询执行计划。
Explain字段:
由于通过二级索引,可能会查询到多个匹配值,相比const性能差那么一点。
MySQL就把这种类型的查询定义为了ref。
在上面我们说到,由于唯一索引可能存在多个null,所以用不了const。
那对于 select * from t2 where key2 is null 来说,不管是唯一索引还是普通索引,其最多用到ref这种类型。
MVCC是什么?全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。
特点:MVCC 通过为每个数据行存储多个版本来实现对并发事务的控制。每个版本包含了该数据行在某个时间点的快照信息。在读取数据时,数据库会根据当前事务的时间戳来选择合适的版本,从而避免了数据的锁定和阻塞。
使用场景:MVCC 通常用于多用户并发访问的数据库系统中。在传统的并发控制机制中,如果两个事务同时对同一行进行修改,其中一个事务必须等待另一个事务完成才能进行操作,从而导致性能下降。而 MVCC 可以在不阻塞其他事务的情况下,实现对并发事务的控制。
MySQL的InnoDB引擎在Update操作,如果不走索引的情况下,依然锁住整张表。博客地址
为什么要有 MVCC:MVCC 可以避免传统的并发控制机制中的锁定和阻塞问题,提高了并发操作的效率和吞吐量。同时,MVCC 还可以实现可重复读和快照隔离等高级事务特性,提高了数据库的可用性和数据一致性。
MVCC用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。(这里的读是指快照读,而不是当前读,当前读会加锁,是悲观锁)
以下都是当前读
select lock in share mode (共享锁)
select for update (排他锁)
update (排他锁)
insert (排他锁)
delete (排他锁)
串行化事务隔离级别
以下是快照读(快照读读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据)
不加锁的select操作(注:事务级别不是串行化)
MVCC解决的问题并发读-写时:可以做到读操作不阻塞写操作,同时写操作也不会阻塞读操作。解决脏读、幻读、不可重复读等事务隔离问题,但不能解决上面的写-写 更新丢失问题。
因此有了下面提高并发性能的组合拳:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。