mysql事务

数据库分库分表思路

我的未来我决定 提交于 2019-11-28 11:46:24
一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式: 垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

醉酒当歌 提交于 2019-11-28 11:14:39
目录 视图 *** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysql的默认结束符(;) 触发器死循环 六个触发器的执行时机 新增前、新增后、删除前、删除后、更新前、更新后 NEW对象指代的就是当前记录(对象) 事务 ***** 什么是事务 事务的四大特性 ACID A:原子性 atomicity C:一致性 consistency I:隔离性 isolation D:持久性 durability 如何开启事务 事务回滚 永久性更改 小案例 存储过程 什么是存储过程 如何创建存储过程 语法结构 案例 定义存储过程 在mysql中调用存储过程 在pymysql中调用存储过程 案例-- 使用存储过程监测事务 函数 MySQL内置函数 常见函数及练习 date_format() 函数(需掌握) 自定义函数 流程控制 if 条件语句 while 循环 索引与慢查询优化 ** 详细内容参考egon 的博客 前言(摘抄) 索引 扩展阅读 常见 索引 索引的本质 索引的缺点 小结 索引的数据结构 -- B+ 树 聚集索引非聚集索引 联合索引 慢查询优化 注意这块的小点能提高sql语句性能 测试索引 正确使用索引 小科普 核心业务逻辑代码一般都是 放在服务端 的

详细介绍MySQL/MariaDB的锁

烈酒焚心 提交于 2019-11-28 10:43:15
本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围。 InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X)。   为了支持多粒度锁定,InnoDB支持意向锁,该锁允许事务在行锁和表锁同时存在。包括意向共享锁(IS)和意向排他锁(IX)。   意向锁将锁定的对象分为多个层次,意味着事务希望在更细粒度上进行加锁,如需要对页上的记录r加X锁,分别需要对数据库、表、页加意向锁IX,最后对记录r加X锁,其中任何一部分导致等待,该操作需要等待粗粒度锁的完成。 3. 锁的查看方式    通过show engine innodb status来查看,其中的transactions片段可以看到事务,其中包括锁等待。   在information_schema架构下,有3个表记录了事务和锁相关的信息。分别是 INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS 。(具体看书或博客) 4. 一致性非锁读   非锁定读机制,是InnoDB存储引擎的默认设置,默认 读取不会占用和等待表上的锁   InnoDB存储引擎利用 行多版本控制 实现一致性非锁读,   当读取的行正在加X锁DELETE或UPDATE时,读操作不会等待锁释放,会读取行的一个 快照数据   快照数据是指该行之前版本的数据,其通过

重新学习MySQL数据库10:MySQL里的那些日志们

徘徊边缘 提交于 2019-11-28 10:38:46
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/79160674 同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志可以帮助我们定位mysqld内部发生的事件,数据库性能故障,记录数据的变更历史,用户恢复数据库等等。本文主要描述错误日志文件。 微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 ​ MySQL日志文件系统的组成 a、错误日志:记录启动、运行或停止mysqld时出现的问题。 b、通用日志:记录建立的客户端连接和执行的语句。 c、更新日志:记录更改数据的语句。该日志在MySQL 5.1中已不再使用。 d、二进制日志:记录所有更改数据的语句。还用于复制。 e、慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。 f

分布式事务之解决方案(TCC)

安稳与你 提交于 2019-11-28 10:38:04
4. 分布式事务解决方案之TCC 4.1. 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作 :预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作既回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。 分支事务失败的情况 : TCC分为三个阶段 : Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm一起才能真正构成一个完整的业务逻辑。 Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm。通常情况下,采用TCC则认为Confirm阶段是不会出错的。即 :只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。 Cancel阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了

重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现

余生颓废 提交于 2019-11-28 10:37:17
说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同。 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快。锁机制是表锁,支持全文索引 InnoDB :支持事务、支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引。锁机制是行锁,不支持全文索引 Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服务器关闭后,数据会丢失掉。 如何选择存储引擎: MyISAM:应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高。 InnoDB:用于事务处理应用程序,支持外键,如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性。更新删除等频繁(InnoDB可以有效的降低由于删除和更新导致的锁定),对于数据准确性要求比较高的,此引擎适合。 Memory:通常用于更新不太频繁的小表,用以快速得到访问结果。 Mysql中的锁 如果熟悉多线程,那么对锁肯定是有概念的,锁是计算机协调多个进程或线程对某一资源并发访问的机制。 Mysql中的锁分为表锁和行锁: 顾名思义,表锁就是锁住一张表,而行锁就是锁住一行。 表锁的特点:开销小,不会产生死锁,发生锁冲突的概率高,并且并发度低。 行锁的特点:开销大,会产生死锁,发生锁冲突的概率低,并发度高。

重新学习MySQL数据库6:浅谈MySQL的中事务与锁

陌路散爱 提交于 2019-11-28 10:36:27
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的;在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍。 事务其实就是并发控制的基本单位;相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位;数据库事务的 ACID 四大特性是事务的基础,了解了 ACID 是如何实现的,我们也就清除了事务的实现,接下来我们将依次介绍数据库是如何实现这四个特性的。 原子性 在学习事务时,经常有人会告诉你,事务就是一系列的操作,要么全部都执行,要都不执行,这其实就是对事务原子性的刻画;虽然事务具有原子性,但是原子性并不是只与事务有关系,它的身影在很多地方都会出现。 由于操作并不具有原子性,并且可以再分为多个操作,当这些操作出现错误或抛出异常时,整个操作就可能不会继续执行下去,而已经进行的操作造成的副作用就可能造成数据更新的丢失或者错误。 事务其实和一个操作没有什么太大的区别,它是一系列的数据库操作(可以理解为 SQL)的集合,如果事务不具备原子性,那么就没办法保证同一个事务中的所有操作都被执行或者未被执行了

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB

☆樱花仙子☆ 提交于 2019-11-28 10:34:29
作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 ![](https://img2018.cnblogs.com/blog/1092007/201908/1092007-20190824162501679-1707813820.png) 添加描述 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出。 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是数据库和实例: 数据库:物理操作文件系统或其他形式文件类型的集合; 实例:MySQL 数据库由后台线程以及一个共享内存区组成; 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍。 数据库和实例 在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库

事务的管理

China☆狼群 提交于 2019-11-28 10:17:37
事务的基本流程: 开启事务:start transaction; 创建一个保存点:savepoint 保存点名 回到保存点(根据具体情况):rollback to保存点名 在MySQL上具体演示: mysql> start transaction; --开启事务 Query OK, 0 rows affected (0.00 sec) mysql> savepoint aa; --设置保存点aa Query OK, 0 rows affected (0.00 sec) mysql> insert into account values(1, '张三', 10); --添加一条记录 Query OK, 1 row affected (0.00 sec) mysql> savepoint bb; -- 设置保存点bb Query OK, 0 rows affected (0.00 sec) mysql> insert into account values(2, '李四', 10000); --再添加一条记录 Query OK, 1 row affected (0.00 sec) mysql> select * from account; --两条记录都在了 +----+--------+----------+ | id | name | balance | +----+-------

mysql了解知识点

感情迁移 提交于 2019-11-28 08:55:53
视图 1.什么是视图   视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用 2.为什么要用视图   如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create views teacher_course as select * from teacher inner join course on course.tid = teacher.id **强调** 1.在硬盘中,视图只有表结构文件,没有表数据文件 2.视图通常是用于查询,不要改动视图表中的数据 3.一般情况下不会频繁的使用视图来写业务逻辑 触发器 在满足对某张表数据的 增,删,改 的情况下,自动触发的功能称之为触发器 1.为何要用触发器   触发器专门针对我们对 某一张表数据增insert,删delete,改update的行为 ,这类行为一旦执行 就会触发触发器的执行,即自动运行另外一段sql代码 2.创建触发器语法  固定语法结构 create trigger 触发器的名字 after\before insert\update\delete on 表名 for each row begin sql 语句 end  最终固定语法 create trigger tri_after\before_insert\update\delete_user after\before insert\update