读一读

行级锁可以最大程度地支持并发处理(同时也带来了最大的开销)。行级锁只在存储引擎层实现,没有在MySQL服务层实现。


表锁是Mysql中最基本的锁策略,并且是开销最小的策略。它会锁定整张表。当对表进行写操作前,需要获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取用户才能获取读锁,读锁之间是不互相阻塞的。

写锁的优先级比读锁高,因此一个写锁请求可能会被插入到读锁队列前面。


一种提高共享资源并发性的方式就是让锁定对象更有选择性。只锁定要修改的数据片段,锁定的数据量越少,则系统的并发程度越高。

但是加锁也是要消耗资源。锁定各种操作,都会增加系统的开销。

锁策略就是在锁的开销和数据的安全性之间寻求平衡,当然也会影响性能。


同一时刻并发读取都不会有问题,但是如果同时有修改呢?同一时刻并发写入就不用说了吧。

在处理并发读或者写时,可以通过实现一个由两种类型的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)

读锁是共享的,或则说是互相不阻塞的。多用户可以同时读取同一个资源。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这样才能保证同一时刻只有一个用户在执行写入,并防止其他用户读取写入的同一资源。

在实际的数据库系统中,每时每刻都在发生锁定。大多时候,MySQL锁的内部管理是透明的。


无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。例如同时的插入两条数据,这时这两条数据会交叉在一起,导致数据损坏。


Mysql会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。

优化器并不关心表使用的是什么存储引擎,但存储引擎对于优化查询是有影响的。优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。

对于SELECT语句,在解析查询之前,服务器会先检查缓存(Query Cache),如果可以找到对应的查询,直接返回缓存的结果集。


每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或则CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程。

先认证账户密码主机信息,连接后验证权限


QQ图片20171014164253.png

QQ图片20171014164433.png


Mysql最重要的最与众不同的特性就是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。


alter table table_name AOTO_INCREMENT=10000;

修改的起始值要大于原来的才有效

也可以直接在创建的时候指定