一篇文章总结了mysql数据库事件以及如何使用mysql事件
本文目录:
- 1、一文总结高并发大数据量下MySQL开发规范的“军规”
- 2.mysql数据库
- 三、浅谈Mysql数据库分库分表——亿级数据存储解决方案
- 4、mysql数据库事件调用有错误日志记录吗?
- 5、一篇文章详解——MySQL事务和锁
本文总结了高并发、大数据量下MySQL开发规范的“军规”
MySQL 是互联网公司中使用最广泛的数据库。对于高并发、大数据量的互联网业务,如何高效地使用MySQL来保证服务的稳定性呢?根据我多年运维管理经验的总结,列出了一些重要的开发规范,希望能够为大家服务。
1. 基本规范
2. 库表设计
问题:使用 VARCHAR(5) 和 VARCHAR(200) 存储“hello”的磁盘空间开销是相同的。使用较短的列表有什么好处? ?
定义的列越大,消耗的内存就越多,因为 MySQL 通常会分配固定大小的内存块来存储内部值,特别是在使用临时内存表进行排序或操作时。
3.索引设计
基本规则:索引越多越好。不要尝试添加无法添加的索引。过多的索引会严重降低数据插入和更新的效率,并造成更多的读写冲突和死锁! ? 从选项卡名称中选择 id、name、adr,其中 code=10001;不会使用索引
SELECT id,name,adr from tab_name where code='10001';将使用索引
从表限制 10000.10 中选择 *;
LIMIT原理:
限制10000.10 偏移量越大,速度越慢
从表中选择 * WHERE id=23423 limit 11; #10+1(每页 10 项)
从表格中选择 * WHERE id=23434 limit 11;
Select * from table WHERE id = (select id from table limit 10000,1) limit 10;
Select * from table INNER JOIN (SELECT id from table limit 10000,10) USING(id)
最后说明:
以上规范是多年使用 MySQL 数据库经验的总结。 ,希望能给您带来一些启发和帮助!

mysql数据库
MySQL数据库泛指MySQL。 MySQL是由瑞典MySQL AB公司开发的关系型数据库管理系统。
mysql是一个开源的关系型数据库系统,广泛应用于网站和APP应用中。它可以存储数据、存储分段数据以及检索和查询数据。 。
默认MySQL数据库中有一个库。这是mysql系统数据库。它可以存储系统数据,包括mysql数据库信息、数据库root帐户、普通帐户和数据库名称以及数据库的一些表。还存储了一些数字数据类型结构。
mysql数据库的好处
(1)MySQL数据库采用C和C++语言编写,并使用各种编辑器进行测试,保证源代码的可移植性。
(2) 支持多种操作系统如:Windows、Linux、Mac OS 等。
(3) 支持多线程,可以充分利用CPU 资源。
(4)提供包括C语言、Java、PHP、Python语言等多种编程语言的API。
(5)MySQL优化SQL算法,有效提升查询速度。
(6) MySQL 提供用于管理、监控和优化数据库操作的管理工具。
(7)它可以作为客户端-服务器网络环境中的独立应用程序使用,也可以作为库嵌入到其他软件中并提供多语言支持。
浅谈mysql数据库分库分表——亿级数据存储解决方案
MySQL分库和分表一般有以下场景
其中1和2比较容易实现。本文重点介绍表的水平拆分和数据库的水平拆分,以及基于mybatis插件方式的水平拆分方案的实现。
文章《聊一聊扩展字段设计》解释了基于KV的水平存储的扩展字段方案。这是一个非常典型的表格可以水平划分的场景。主表和kv表是一对N的关系。随着主表数据量的增加,KV表线性增长最多N倍。
这里我们将KV表横向拆分为场景
对于kv扩展字段查询,只是根据id+key或者id作为条件进行查询,所以这里我们可以根据id进行拆分
分为512张表(实际表数量取决于添加字段的频率)
表拆分后,表名 kv_000 ~ kv_511
id % 512 = 1 .... 分为 kv_001,
id % 512 = 2 ....分配给kv_002
等等!
水平分割表格相对简单。基于mybatis插件的实现方案稍后讨论
场景:下面我们根据博客文章表分析
在数据库分片场景。目的:
表结构如下(摘录部分字段):
根据user_id分片
。如果分1024个库,根据user_id % 1024 hash
user_id % 1024 = 1 分配给db_001库
user_id % 1024 = 2 分配给db_002库
以此类推
目前有2个节点。如果后面遇到瓶颈,可以增加到4个节点
最大可以增加到1024个节点,性能线性提升
水平分片/分片后,首先考虑非shardingKey查询
基于mybatis分片,用得最多的一种是基于Spring AOP的,另一种是基于mybatis插件的。其实这两种方法的思路是相似的。
为了更直观地解决这个问题,我在Executor和StatementHandler阶段实现了两个拦截器
来实现动态数据源获取接口
测试结果如下
由此可见,Executor阶段需要更改数据源
对于分支数据库:
原始SQL:
目标SQL:
定义了三个注解
@useMaster 或者强制读取器
@shardingBy 分片标识符
@DB 定义逻辑表名、库名和分片策略
1)写入实体
插入
select
以上成功实现了mysql-子数据库,出于同样的原因。也很容易实现并发分库分表。
这个插件的具体实现方案已经开源了:
目录如下:
对于mysql的分库和表,首先要弄清楚瓶颈在哪里(IO还是CPU),是否是是子库还是子表,有多少个?不能为了共享数据库和表而对其进行拆分。
基本上尝试先垂直分割,然后水平分割。
以上基于mybatis插件的分库分表,是一个实现思路,还有很多不完善之处,
例如:
mysql数据库的事件调用是否有错误日志记录
1. 错误日志
错误日志在Mysql数据库中非常重要。它记录了mysqld的开始和结束,以及服务器运行过程中发生的任何错误的信息。
1。配置信息
--log-error=[filename]用于指定错误日志的存储位置。
如果不指定[filename],则默认使用hostname.err作为文件名,并默认保存在DATADIR目录下。
您还可以在my.cnf文件中配置log-error,这样就无需在每次启动mysqld时手动指定--log-error。例如:
[mysql@test2]$ vi /etc/my.cnf
#MySQL服务器
[mysqld]
....
详细文章-MySQL事务和锁
当多个用户访问同一数据时,当一个用户更改数据时,其他用户可以同时发起更改请求。为了保证数据库记录从一种一致性状态更新到另一种一致性状态,使用事务处理是非常有必要的。交易具有以下四个特征:
MySQL提供了多种事务型存储引擎,例如InnoDB和BDB,但MyISAM不支持事务。为了支持事务,InnoDB存储引擎引入了与事务处理相关的REDO日志和UNDO日志。同时,事务依赖于MySQL
的锁定机制。执行事务时,必须将执行的事务日志写入日志文件。关联的文件是REDO日志。当每个SQL语句执行数据更新操作时,REDO日志首先写入日志缓冲区。当客户端执行COMMIT命令提交时,日志缓冲区的内容被刷新到磁盘。日志缓冲区的刷新方式或时间间隔可以通过 innodb_flush_log_at_trx_commit 参数控制
REDO 日志对应磁盘上的 ib_logifleN 文件,默认设置为 5 MB。建议将其设置为 512 MB 以允许更大的事务。 MySQL崩溃恢复时,会重做REDO日志记录,恢复最新数据,保证提交事务的持久性
与REDO日志不同,UNDO日志主要用于事务发生异常时回滚数据的性能。具体内容就是记录数据。修改前的信息存储在UNDO缓冲区中,然后在适当的时间将内容刷新到磁盘
如果由于系统错误或回滚操作导致事务回滚,则可以回滚未修改的信息恢复到更改之前的状态,以确保情况并非如此。已提交事务的原子性
与 REDO 日志不同,磁盘上没有单独的 UNDO 日志文件。所有UNDO日志都存储在表空间对应的.ibd数据文件中,即使MySQL服务启动独立表空间
在MySQL中可以使用BEGIN启动事务,使用COMMIT启动事务结束,使用ROLLBACK撤销交易。 MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务。
MySQL定义了四种隔离级别,指定一个事务中的哪些数据变化对其他事务可见,哪些表中的数据对其他事务不可见。低级隔离级别可以支持更高的并发处理,同时消耗更少的系统资源
InnoDB 系统级事务隔离级别可以使用以下语句设置:
查看系统级事务隔离级别:
InnoDB 的会话级事务隔离级别可以使用以下语句进行设置:
查看会话级事务隔离级别:
在该隔离级别下,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据称为脏读,即先启动两个事务A和B,在事务B更新但未提交之前,事务A读取了更新后的数据,但由于事务B回滚,导致事务A出现脏读
所有事务只能看到已提交事务所做的更改。该级别可以解决脏读,但也会导致不可重复读:先使能A,B中有两个事务,事务A读取事务B的数据,事务B更新发送后,事务A读取更新后的数据数据 。此时,事务A中的同一个查询中出现了多个查询。 结果
MySQL默认的事务隔离级别会导致同一事务的多个实例在同时读取数据时看到相同的数据行。理论上这会引起一个问题,幻读。例如,第一个事务更改表中的数据。此更改会影响表中的所有数据行。同时,第二个事务也改变了表中的数据。此更改将插入到表中。当一行新数据出现时,执行第一个事务的用户会发现表中仍然有未更改的数据行
InnoDB 通过多版本并发控制机制(MVCC)解决了这个问题:InnoDB 解决了这个问题问题。这是通过向行添加两个隐式值来实现的。这两个隐式值记录了行创建时间、行过期时间以及每行保存时间发生时的系统版本号。对于每次搜索,都会根据事务的版本号检索结果。
通过强制事务处理来解决幻读问题,使它们不会相互冲突。基本上,它是通过为每个读取数据行添加共享锁来实现的。这个级别会导致大量的超时和锁竞争。一般不建议使用
。解决数据库并发控制的问题,比如去同。当客户端对同一个表进行更新或查询操作时,必须管理并发操作,因此会产生锁
共享锁的粒度是行或元组(多行)。事务获取共享锁后,可以对锁范围内的数据进行读操作
排它锁的粒度与共享锁相同。事务获取排它锁后,就可以对锁范围内的数据进行写入
有两个事务A和B。如果事务A获取了某个元组的共享锁,则事务B也可以立即获取该元组的共享锁,但不能获取该元组的排它锁。它必须等到事务 A 释放共享锁。后。如果事务A获得了某个元组的排他锁,那么事务B不能立即获得该元组的共享锁,事务B也不能立即获得该元组的排它锁。必须等待A释放排他锁
意向锁是表锁的一种,锁的粒度是全表,分为意向共享锁和意向排他锁。意向共享锁表示事务打算拥有数据的共享锁或排它锁。有意表示事务想要执行该操作,但尚未实际执行
锁的粒度主要分为表锁和行锁
表锁的开销最小,允许的并发量为也是最小的。 MyISAM存储引擎就使用这种锁定机制。当需要写入数据时,整个表记录被锁定,其他读/写操作等待。一些特定的操作,例如ALTER TABLE,在执行时也会使用表锁。
行锁可以支持最大并发,InnoDB存储引擎就使用这种锁定机制。如果要支持并发读/写,建议使用InnoDB存储引擎
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
