MySQL数据库的并发性与锁有很大的关系:
读锁:
是共享锁,施加后,其他人可以读,但是不能写。
写锁:
是独占锁,施加后,其他人不能写、也不能读。
由于数据库的读量大于写量,所以当读锁源源不断时,写锁就不能施加。所以可能采用读5个,写1个的策略施加锁就可以解决问题(具体的情况视各自的"锁策略"而定)
锁粒度:
当锁是锁定整个表的时候,那么即使"锁策略"再好,也不会有很好的性能。所以我们可以考虑只锁定我们需要数据所在的那几个数据块。甚至只锁定我们需要那一行数据。
锁粒度越低,并发性越好,但是需要维护的成本也越大。
表级锁:锁定整个表
页 锁:锁定需要的数据块
行 锁:维护成本高,容易发生死锁:也就是A、B用户同时到来。A是先锁定第1行,再锁定第5行;B是先锁定第5行,再锁定第1行。他们都进行到第二步时,就会各自等待,这就是死锁。一般解锁的策略是让资源占用最少的解锁,具体的实现要视不同的策略、不同的公司而定。
MySQL的工作模型:
一个线程响应一个用户,而且这个线程会长期在线,直到用户退出。但是如果使用API就可能瞬间建立,瞬间退出。
由于涉及到AAA的安全问题,所以MySQL不能一个线程响应多个用户。但是线程的销毁、创建、授权也是需要很长的时间的,所以MySQL采用的是线程池复用的机制。也就是当用户退出后,其使用的线程不会被销毁,而只是快速清空上一个用户的数据库,等待下一个用户的连接。
SQL:
DML:CRUD(insert、update、delete、select),数据库操作语言
DDL:create、drop、alter,数据库定义语言。用来操作数据库对象的,比如表、索引、游标等
DCL:grant revoke,权限管理语言。
事务的ACID特性:
原子性:一般指一组DML(DDL无法实现)语句要么都执行完成,要么都不执行。如果只执行一部分,就回滚。
一致性:数据库的总量保持不变,比如银行的转账操作,A减去1000,B就得加1000.
隔离性:多个事务(SQL语句)不能同时操作一个数据。有4个隔离级别:
读未提交:READ UNCOMMITED
读 提 交:READ COMMITED 大多数数据库的默认
可 重 读:REPEATABLE READ MySQL的默认,较严格
可串行化:SERIABLIZABLE
持久性:只要事务一提交,那么数据库的状态一定是改变的,不能被断电情况影响。它也有级别之分
1、只要事务一提交就从内存同步到事务日志,同时也会1秒同步一次,这样大的事务不会丢失
2、只有在事务提交时才会同步到事务日志,没有其他同步。
MySQL日志:
mysql> SHOW [GLOBAL|SESSION] VARIABLES LIKE '%log%';
这样子可以看到所有关于日志的变量:
错误日志、查询日志、慢查询日志、事务日志
错误日志:
默认开启,且在datadir的根目录下,文件名是"HOSTNAME.err"
可以在/etc/my.cnf中定义
log_error=/path/to/NAME.err,
log_warnings = {1|0}警告信息是否一并记录到错误日志
记录内容如下:
1、MySQL启动、关闭过程中的信息,未必是错误信息。
会包含sock文件找不到、MySQL未初始化
还比如会反解0.0.0.0到本地失败的信息
2、服务器运行过程中的错误信息
3、时间调度器运行一个时间时产生的信息
4、在从服务器上启动从服务器进程时产生的信息。
查询日志:
默认不启用,因为会严重降低性能。
慢查询日志:
它记录了一组DML的SQL语句从启动到执行完成的操作时长,包含了由于锁问题被阻塞的时间,用来定位问题。有的资料叫做墙上的挂钟时间。一般开启,对性能影响不大。
事务日志:
记录DML语句本身到一个具有连续磁盘块且固定大小的文件上。
它不是历史日志,具有幂等性,也就是多次操作后的结果都是一样的。
由于事务日志没有写入磁盘,当下一个操作需要用到上一个操作的结果时,事务日志就必须能够生成一个视图给用户查询。
事务日志能够容纳一段时间内的事务即可,文件越大,并发性越好,但服务器宕机恢复时间越长。
事务日志有2个或多个,写完一个再写另一个。
事务日志在非阵列存储的情况下,必须不能和数据库文件放到同一个磁盘上,因为会影响性能。
二进制日志:
用途:用来记录修改表数据,或有可能引起表数据改变的SQL语句、发生时间、执行时长等,当不会保留只用来查询的SELECT语句。而且对于slave,就是复制二进制日志的。
二进制日志的查看:

查看当前正在写入的二进制日志及位置
查看二进制日志的内容:
在shell命令行中查看二进制日志的方法:
使用二进制日志回复数据库:
正确删除二进制日志:
由于二进制日志太重要,一般都不会删除,即使删除,也需要现将其备份后再删除。
但是在确定做过备份,且二进制日志没有用的情况下,可以使用purge命令安全删除。
滚动二进制日志:
造成二进制文件的滚动的原因有很多,比如重启mysql服务器等,但也可以手动滚动。