赞
踩
MySQL中的锁机制是数据库并发控制的重要组成部分,它用于管理多个用户对数据库资源的访问,确保数据的一致性和完整性。MySQL中的锁可以根据不同的分类标准进行分类,以下是一些常见的分类方式及对应的锁类型:
1、按锁的粒度分类
全局锁
FLUSH TABLES WITH READ LOCK
命令加全局锁,通过UNLOCK TABLES
命令释放全局锁。表级锁
LOCK TABLES 表名 READ/WRITE
命令加表锁,通过UNLOCK TABLES
命令释放表锁。行级锁
2、按锁的属性分类
共享锁(S锁)
排他锁(X锁)
3、其他锁类型
意向锁
元数据锁(MDL)
乐观锁
悲观锁
1、MyISAM(常用)
2、InnoDB(常用)
3、Memory(HEAP)
4、CSV
5、Archive
6、Blackhole
MyISAM和InnoDB是MySQL数据库中两种常用的存储引擎,它们在多个方面存在显著的区别。以下是对这两种存储引擎的详细比较:
1、数据存储结构
MyISAM:
.frm
文件:存储表结构定义。.MYD
文件:存储数据文件。.MYI
文件:存储索引文件。InnoDB:
ibdata1-n
。.ibd
为扩展名。2、锁机制
MyISAM:
InnoDB:
3、事务支持
MyISAM:
InnoDB:
4、外键约束
MyISAM:
InnoDB:
5、其他特性
MyISAM:
InnoDB:
6、适用场景
MyISAM:
InnoDB:
综上所述,MyISAM和InnoDB在数据存储结构、锁机制、事务支持、外键约束等方面存在显著的差异。在选择存储引擎时,需要根据应用的实际需求和场景来选择合适的存储引擎。
MySQL中的事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些属性确保了事务的完整性和可靠性。
MySQL支持四种事务隔离级别,它们逐渐增强了事务之间的隔离,防止了不同程度的并发问题:
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重复读)
SERIALIZABLE(可串行化)
MySQL事务的持久性是通过重做日志(redo log)来保证的。当事务提交时,事务所做的所有修改都会先写入重做日志中,并在事务提交时将其刷新到磁盘上。这样,即使系统发生故障,也可以通过重做日志来恢复事务的修改,确保数据的持久性。
事务的原子性是通过回滚日志(undo log)来保证的。当事务执行过程中发生错误或需要回滚时,可以通过回滚日志来撤销事务中所做的修改,将数据库恢复到事务开始前的状态,从而保证事务的原子性。
在数据库中,即使设置了索引,也可能在某些情况下失效,导致查询性能并未得到预期的提升。以下是一些导致索引失效的常见情况:
1、索引列未包含在查询条件中
user_id
上创建了索引,但查询条件是SELECT * FROM users WHERE name = 'John'
,此时user_id
上的索引将不会被使用。2、索引列上进行了函数操作
SELECT * FROM users WHERE LOWER(username) = 'john'
,如果username
上有索引,但由于使用了LOWER()
函数,索引将失效。3、索引列与查询条件数据类型不匹配
SELECT * FROM users WHERE age_str = 30
(假设age_str
是存储年龄的字符串类型字段)。4、使用了不等于(!= 或 <>)操作符
SELECT * FROM users WHERE age != 30
,如果age
上有索引,该查询可能导致索引失效。5、LIKE操作符的模糊查询且前缀为通配符
SELECT * FROM users WHERE username LIKE '%john'
。6、复合索引的列顺序不匹配
SELECT * FROM table WHERE B = 'value'
。7、索引列上存在大量重复值
8、索引列上进行了隐式类型转换
SELECT * FROM table WHERE varchar_column = 123
。9、查询条件中包含OR连接多个条件且部分列无索引
SELECT * FROM table WHERE column1 = 'value1' OR column2 = 'value2'
,如果只有column1
有索引而column2
没有。10、数据库统计信息过时或不准确
11、数据量较小或索引选择性差
12、索引碎片过多
为了避免索引失效,可以采取以下措施:
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们
包含着对数据表里所有记录的引用指针。
普通索引(由关键字KEY或 INDEX定义的索引)的唯一任务是加快对数据的访问速
度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼
此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它
定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯
一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索
引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,
因为在执行这些写操作时,还要操作索引文件。
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个
不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤
销。
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修
改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依
旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和
第二个表都要回到未修改的状态,这就是所谓的事务回滚.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。