MySQL中的大表和大事务

MySQL中的大表和大事务,第1张

    千万行数据,表数据巨大。

                1、慢查询的产生:很难在一定时间内过滤出所需要的数据。

                2、建立索引需要更长的时间。

                                Mysql版本<5.5 建立索引会锁表

                                Mysql版本>=5.5 谁让不会锁表,但会引起主从延迟。

                3、修改表结构需要长时间锁定表

                4、会造成长时间的主从延迟。

                5、影响正常的数据 *** 作

                1、分库分表把一张大表分为多个小表

                    难点:

                        分表主键的选择

                        分表后跨分区数据 的查询和统计

                2、大表的历史数据归档

                   好处:

                        减少对前后端业务的影响。

                   难点:

                        归档时间点的选择

                        如何进行归档 *** 作。

        运行时间比较长, *** 作的数据比较多的事务

            锁定太多的数据,造成大量的阻塞和锁超时。

            回滚时间比较长

            执行时间比较长,容易造成主从延迟。

            避免一次处理太多的数据。

            移除不必要在事务中 *** 作的select *** 作

什么是事务? \x0d\x0a\x0d\x0a事务是逻辑上的一组 *** 作,组成这组 *** 作的各个单元,要不全都成功要不全都失败,这个特性就是事务 \x0d\x0a\x0d\x0a注意:mysql数据支持事务,但是要求必须是innoDB存储引擎 \x0d\x0a\x0d\x0a解决这个问题: \x0d\x0a\x0d\x0amysql的事务解决这个问题,因为mysql的事务特性,要求这组 *** 作,要不全都成功,要不全都失败,这样就避免了某个 *** 作成功某个 *** 作失败。利于数据的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在执行sql语句之前,我们要开启事务 start transaction\x0d\x0a\x0d\x0a(2)正常执行我们的sql语句 \x0d\x0a\x0d\x0a(3)当sql语句执行完毕,存在两种情况: \x0d\x0a\x0d\x0a1,全都成功,我们要将sql语句对数据库造成的影响提交到数据库中,committ \x0d\x0a\x0d\x0a2,某些sql语句失败,我们执行rollback(回滚),将对数据库 *** 作赶紧撤销 \x0d\x0a\x0d\x0a(注意:mysql数据支持事务,但是要求必须是innoDB存储引擎) \x0d\x0amysql>create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8\x0d\x0a\x0d\x0amysql>inset into bank values('shaotuo',1000),('laohu',5000)\x0d\x0a\x0d\x0amysql>select*from bank\x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------没有成功“回滚”执行rollback \x0d\x0amysql>start transaction//开启事务 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql>update bank set money=money+500 where name='shaotuo'\x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql>update bank set moey=money-500 where name='laohu'\x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql>rollback//只要有一个不成功,执行rollback *** 作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql>select*from bank\x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 进行commit *** 作 \x0d\x0amysql>start transaction//开启事务 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql>update bank set money=money+500 where name='shaotuo'\x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql>update bank set money=money-500 where name='laohu'\x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql>commit//两个都成功后执行commit(只要不执行commit,sql语句不会对真实的数据库造成影响) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql>select*from bank\x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+

1. 普通事务

以 begin / start transaction 开始,commit / rollback 结束的事务。或者是带有保存点 savepoint 的事务。

2. 链式事务

一个事务在提交的时候自动将上下文传给下一个事务,也就是说一个事务的提交和下一个事务的开始是原子性的,下一个事务可以看到上一个事务的处理结果。MySQL 的链式事务靠参数 completion_type 控制,并且回滚和提交的语句后面加上 work 关键词。

3. 嵌套事务

有多个 begin / commit / rollback 这样的事务块的事务,并且有父子关系。子事务的提交完成后不会真的提交,而是等到父事务提交才真正的提交。

4. 自治事务

内部事务的提交不随外部事务的影响,一般用作记录内部事务的异常情况。MySQL 不支持自治事务,但是某些场景可以用 MySQL 的插件式引擎来变相实现。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/7455265.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-05
下一篇2023-04-05

发表评论

登录后才能评论

评论列表(0条)

    保存