mysql之innodb自增锁原理实现

mysql之innodb自增锁原理实现 1 自增锁知识点 1.1 定义 自增锁是一种表级锁(table-level lock),专门针对插入 AUTO_INCREMENT 类型的列。同一表,假设事务 A 正在插入数据,则另一个事务 B 尝试 INSERT 语句,事务 B 会被阻塞住,直到事务 A 释放自增锁,以便事务A插入的行是连续的主键 ID

mysql快照读原理实现

Innodb之快照读原理实现 1 Innodb MVCC组成 1. 1 为何使用MVCC实现快照读 innodb存储引擎的快照读是基于多版本并发控制 MVCC 和 undolog 实现,通过 MVCC 机制提高系统读写并发性能,快照读只发生于 select 操作,但不包括 select … lock in share mode, select … for update  提高并发的思路 并发数据一致性通常实现: 锁 + 多数据版本

MySQL中的page页详解

1 InnoDB中的存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间(tablespace),而表空间由段(sengment)、区(extent)、页(page)组成。 在一些文档中extend又称块(block)。 1.1 表空间(table space) 表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。 在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。如果是共享表空间就意味着多张表共用一个表空间。如果是独立表空间,就意味着每张表有一个独立的表空间,也就是数据和索引信息都会保存在自己的表空间中。独立的表空间可以在不同的数据库之间进行迁移。可通过命令 mysql > show variables like 'innodb_file_per_table'; 查看当前系统启用的表空间类型。目前最新版本已经默认启用独立表空间。

MYSQL高级特性之【Event事件】

一、基本概念 mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。 二、适用范围 对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。 例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表。 每天清除数据表中的过期的记录。 三、使用权限 单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。 当event和procedure(存储过程)配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。 查看EVENT命令有如下几种: >(1)查询mysql.event表; (2)通过SHOW EVENTS命令; (3)通过SHOW FULL EVENTS命令; (4)通过查询information_schema.

MYSQL高级特性之【存储过程与函数】

一、定义 存储程序可以分为存储过程和函数。 1.1 存储过程的定义 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。存储过程在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.2 函数的定义 存储函数(简称函数)在本质上与存储过程没有区别。 只是函数有如:只能返回一个变量的限制,而存储过程可以返回多个。函数是可以嵌入在SQL中使用,可以在select中调用,而存储过程不行。 二、创建存储过程和函数 存储过程和函数的创建过程很相似。 2.1 创建存储过程 语法 >CREATE PROCEDURE sp_name ([ proc_parameter ]) [ characteristics.

库级优化之SHOW GLOBAL STATUS

慢查询 //查询慢线程情况 show global status like '%slow%' +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | Slow_launch_threads | 1 | | Slow_queries | 100 | +---------------------+-------+ 如果Slow_launch_threads值较大,说明有些东西正在延迟连接的新线程 //查询慢查询日志是否开启 show variables like '%slow%' +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ |log_slow_admin_statements| ON | |log_slow_slave_statements| OFF | | slow_launch_time | 2 | | slow_query_log | ON | | slow_query_log_file | /home/mysql/mysql/slow_query.

后端开发需要了解的mysql优化方向

#优化思维导图 #参数优化注意事项 参数优化分为 动态参数配置 和 配置文件的配置,建议在启动mysql之前配置好优化参数,这样将会全局有效,如使用动态参数配置可能会不生效或出现问题,并且如果数据库重启那么之前的优化参数都会失效 SHOW VARIABLES LIKE 'sort%' 修改会话级变量 set SESSION sort_buffer_size=720000 退出重新连接后,此参数恢复原值 修改全局变量 set GLOBAL sort_buffer_size = 720000 #优化系列 库级优化之SHOW GLOBAL STATUS

数据库设计三范式和反范式

数据库范式 范式的级别 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余(反三范式,一般某个数据经常被访问时,比如数据表里存放了语文数学英语成绩,但是如果在某个时间经常要得到它的总分,每次都要进行计算会降低性能,可以加上总分这个冗余字段)。 后面的范式是在满足前面范式的基础上,比如满足第二范式的一定满足第一范式。 第一范式(1NF):确保每一列的原子性 如果每一列都是不可再分的最小数据单元,则满足第一范式。 但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。 第二范式:非键字段必须依赖于键字段 如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。例如: 第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)