修改相关配置,使应用尽可能高效运行。
优化器并不关心表使用的是什么存储引擎,但存储引擎对于优化查询是有影响的。
优化器会起请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息
等。
对于 SELECT 语句,在解析查询之前,服务器会先检查缓存(Query cache),如果能够
在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是
直接返回查询缓存中的结果集。
二.并发控制
多个线程同时修改数据,存在数据不一致的情况,也就是并发控制的问题。
并发控制分为服务器层控制和存储引擎层控制两方面。都是使用读写锁来控制。
1、 MVCC:Multi-Version Concurrent Control 多版本并发控制
MVCC 是为了实现数据库的并发控制而设计的一种协议。从我们的直观理解上来看,
要实现数据库的并发访问控制,最简单的做法就是加锁访问,即读的时候不能写(允
许多个西线程同时读,即共享锁,S 锁),写的时候不能读(一次最多只能有一个线
程对同一份数据进行写操作,即排它锁,X 锁)。这样的加锁访问,其实并不算是真
正的并发,或者说它只能实现并发的读,因为它最终实现的是读写串行化,这样就
大大降低了数据库的读写性能。加锁访问其实就是和 MVCC 相对的 LBCC,即基于锁
的并发控制(Lock-Based Concurrent Control),是四种隔离级别中级别最高的 Serialize
隔离级别。为了提出比 LBCC 更优越的并发性能方法,MVCC 便应运而生。
2、 锁的粒度:
根据锁的粒度,分为表锁和行锁。为了更好的并发控制,锁的粒度应该尽可能小,
也就是只锁定修改的数据。但是,锁本身也有一定的开销,包括获取锁,检查锁是
否释放,释放锁,这些操作也耗费一定的资源。锁的粒度小,在并发控制的时候,
也就意味着需要更多的锁,锁的总开销也就越大。服务器层使用表锁来同步,比如
alter table,这个时候会忽略存储引擎的锁机制。存储引擎支持表锁和行锁,不同存
储引擎的实现不同。
3、 死锁:
死锁是指两个或者多个事务在同一资源上相互作用,并请求锁定对方占用的资源,
从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能产生
死锁。多个事务同时锁定同一个资源时,也会产生死锁
三、事务:
1、事务的定义:
一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户
转账业务,该业务就是一个最小的工作单元 )。一个完整的业务需要批量的
DML(insert、update、delete)语句共同联合完成。事务只和 DML 语句有关,或者说
DML 语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML 语句的个数不同。
2、事务的特性:
原子性(A):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全
都不执行。
一致性(C):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的
数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数
据结构(如 B 树索引或双向链表)也都必须是正确的。
评论2
最新资源