
数据库mysql
文章平均质量分 91
tangshuai96
探索者
展开
-
Mysql学习-第四章(分布式架构篇)-分布式数据库架构选型:分库分表or中间键
分库分表直接访问在业务逻辑中加入分库分表的路由逻辑,在业务层计算出对应分片的信息,然后访问数据库如:void InsertOrders(String orderKey, int userKey...) { int shard_id = userKey % 4; if (shard_id == 0) { conn = MySQLConncetion('shard1',...); conn.query(...); } else if (shard_id == 1) {原创 2021-07-30 09:13:52 · 372 阅读 · 0 评论 -
Mysql学习-第四章(分布式架构篇)
分布式数据库概念分布式数据库是一种把数据分散存储在不同物理位置的数据库。计算层:单机数据库中的sql层,用来对数据访问进行权限检查、路由访问,以及对计算结果的操作。元数据层:记录了分布式数据库集群下有多少个存储节点,对应ip、端口等元数据信息是多少。当分布式数据库的计算层启动时,会先访问元数据层,获取所有集群信息,才能正确进行 SQL 的解析和路由等工作。另外,因为元数据信息存放在元数据层,那么分布式数据库的计算层可以有多个,用于实现性能的扩展。存储层:用来存放数据,但存储层要和计算层在同一台服务原创 2021-07-23 14:48:44 · 1796 阅读 · 0 评论 -
Mysql学习-第三章(或用三大架构)
高可用(High Availability)是系统所能提供无故障服务的一种能力。 简单地说就是避免因服务器宕机而造成的服务不可用。几个9判断宕机时间,并以此计算出每年系统可用时间达到几个 9,来判断高可用架构是否健壮。具体如下表所示:通常来说,系统至少要达到 4 个 9(99.99%),也就是每年宕机时间不超过 52.56 分钟,否则用户体验会非常差,感觉系统不稳定。99.99% = 1 - 52.56 / (3652460)不过 4 个 9 宕机 52 分钟对于生产环境的影响还是比较大,但是原创 2021-06-21 17:56:09 · 196 阅读 · 0 评论 -
Mysql学习-第三章(复制延迟)
逻辑日志的优缺MySQL 复制基于的二进制日志是一种逻辑日志,其写入的是每个事务中已变更的每条记录的前项、后项。有了每条记录的变化内容,用户可以方便地通过分析 MySQL 的二进制日志内容,准时地将 MySQL 中的数据同步到异构的数据平台,如 HBase、ES、Hive 等大数据平台。我们可以发现,逻辑日志简单易懂,方便数据之间的同步,但它的缺点是:事务不能太大,否则会导致二进制日志非常大,一个大事务的提交会非常慢。假设有个 DELETE 删除操作,删除当月数据,由于数据量可能有 1 亿条记录,可原创 2021-06-19 10:36:04 · 319 阅读 · 0 评论 -
Mysql学习-第三章(Mysql复制)
数据库复制本质就是数据同步。MySQL 数据库是基于二进制日志(binary log)进行数据增量同步,而二进制日志记录了所有对于 MySQL 数据库的修改操作。在默认 ROW 格式二进制日志中,一条 SQL 操作影响的记录会被全部记录下来。如下图所示通过 MySQL 数据库自带的命令 mysqlbinlog,可以解析二进制日志,观察到更为详细的每条记录的信息mysqlbinlog -vv binlog.000004以通过二进制日志记录看到被删除记录的完整信息,还有每个列的属性,比如列的类型原创 2021-06-15 21:17:25 · 167 阅读 · 1 评论 -
Mysql学习-第二章(使用分区表)
分区表涉及表结构设计,也设计索引的设计,是否需要设计使用分区表分区表的使用分区表就是把物理表结构相同的几张表,通过一定算法,组成一张逻辑大表。这种算法叫“分区函数”,当前 MySQL 数据库支持的分区函数类型有 RANGE、LIST、HASH、KEY、COLUMNS。无论选择哪种分区函数,都要指定相关列成为分区算法的输入条件,这些列就叫“分区列”。另外,在 MySQL 分区表中,主键也必须是分区列的一部分,不然创建分区表时会失败,比如:CREATE table part(a int,b int,原创 2021-06-10 11:28:37 · 550 阅读 · 0 评论 -
Mysql学习-第二章(使用子查询)
mysql8.0之后对子查询的优化得到大幅提升为什么使用子查询更符合逻辑,如“找到1993年,没有下过订单的客户数量”select count(c_custerkey) cntfromcustomerwhere c_custerkey not in(select o_custerkey from orders where o_orderdate >= '1993-01-01' And o_orderdate < '1994-01-01')原创 2021-06-08 09:36:44 · 236 阅读 · 0 评论 -
Redis怎样实现分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理。分布式锁的常见实现方式有四种:基于 MySQL 的悲观锁来实现分布式锁,这种方式使用的最少,因为这种实现方式的性能不好,且容易造成死锁;基于 Memcached 实现分布式锁,可使用 add 方法来实现,如果添加成功了则表示分布式锁创建成功;基于 Redis 实现分布式锁,这也是本课时要介绍的重原创 2021-05-31 15:57:34 · 353 阅读 · 0 评论 -
Mysql学习-第二章(CBO工作原理)
MySQL 优化器是 CBO,即一种基于成本的优化器。在关系型数据库中,B+ 树索引只是存储的一种数据结构,具体怎么使用,还要依赖数据库的优化器,优化器决定了具体某一索引的选择,也就是常说的执行计划。而优化器的选择是基于成本(cost),哪个索引的成本越低,优先使用哪个索引。对orders表创建3个索引 CREATE TABLE `orders` ( `O_ORDERKEY` int NOT NULL, `O_CUSTKEY` int NOT NULL,原创 2021-05-31 10:21:12 · 877 阅读 · 0 评论 -
Mysql学习-第二章(组合索引)
组合索引是指多个列所组成的B+树索引,既可以是主键索引,也可以是二级索引组合,下图为一个索引图组合索引(a,b),(b,a)完全不同示例,组合索引(a,b),对列ab进行排序SELECT * FROM table WHERE a = ?SELECT * FROM table WHERE a = ? AND b = ?上述 SQL 查询中,WHERE 后查询列 a 和 b 的顺序无关,即使先写 b = ? AND a = ?依然可以使用组合索引(a,b)。但是下面的 SQL 无法使用组合索引原创 2021-05-27 15:28:18 · 1641 阅读 · 0 评论 -
Mysql学习-第二章(索引组织表)
InnoDB 存储引擎是 MySQL 数据库中使用最为广泛的引擎,在海量大并发的 OLTP 业务中,InnoDB 必选。它在数据存储方面有一个非常大的特点:索引组织表(Index Organized Table)。索引组织表数据存储有堆表和索引组织表两种方式堆表中的数据无序存放,数据的排序完全依赖于索引(Oracle、Microsoft SQL Server、PostgreSQL 早期默认支持的数据存储都是堆表结构)。堆表的组织结构中,数据和索引分开存储。索引是排序后的数据,而堆表中的数据是无序的原创 2021-05-26 19:14:33 · 1117 阅读 · 0 评论 -
Mysql学习-第二章(索引排序的艺术)
索引是什么索引是提升查询速度的一种数据结构。索引之所以能提升查询速度,在于它在插入时对数据进行了排序(显而易见,它的缺点是影响插入或者更新的性能)。B+树索引B+ 树索引是数据库系统中最为常见的一种索引数据结构,几乎所有的关系型数据库都支持它。那为什么关系型数据库都热衷支持 B+树索引呢?因为它是目前为止排序最有效率的数据结构。像二叉树,哈希索引、红黑树、SkipList,在海量数据基于磁盘存储效率方面远不如 B+ 树索引高效。所以,上述的数据结构一般仅用于内存对象,基于磁盘的数据排序与存储,最原创 2021-05-26 10:07:19 · 187 阅读 · 1 评论 -
Mysql学习-第一章(表设计表压缩)
数据库由一行行记录组成,每行记录存放到页中,一个页的默认大小为16k,一个个页组成了每张表的表空间如果一个页中存放记录越多,那么性能也越高这是因为,数据库表空间中的页存放在磁盘上,MySQL数据库先从磁盘中的页读取到内存缓冲池中,以页为单位进行读取和管理记录如果想页中的记录变多,可以启用压缩(记录、页、表压缩)普遍使用页压缩这是因为压缩每条记录: 因为每次读写都要压缩和解压,过于依赖 CPU 的计算能力,性能会明显下降;另外,因为单条记录大小不会特别大,一般小于 1K,压缩效率也并不会特别好。原创 2021-05-25 10:19:39 · 875 阅读 · 1 评论 -
Mysql学习-第一章(表设计忘记范式标准,主键设计)
第一范式要求所有属性都是不可分的基本数据项;第二范式解决部分依赖;第三范式解决传递依赖。工程上的表结构设计每张表一定要有一个主键(自增主键设计、UUID主键设计、业务自定义生成主键)消除冗余数据存在的可能并不一定要追求数据库范式标准,有时还会进行反范式的设计自增主键设计非核心业务表可以用BIGINT的自增类型作为主键,由于整型的自增型,数据库插入也是顺序的,性能比较好核心业务表,一定不要用自增做主键6个原因自增存在回溯问题自增值在服务器 产生,存在并发性能问原创 2021-05-24 11:33:17 · 245 阅读 · 1 评论 -
Mysql学习-第一章(表设计JSON类型)
为什么使用json类型。关系型的结构化存储存在一定弊端,预先定义好所有的列以及列对应的类型。业务在发展过程中,需要扩展单个列的描述功能,使用json数据类型,额能够打通关系型和非关系型数据的存储界限,为业务提供更好的架构选择Mysql支持RFC7159定义的JSON规范,主要有JSON对象和JSON数组两种类型。JSON对象表示存储图片的相关信息{ "Image": { "Width": 800, "Height": 600, "Title": "View from 1原创 2021-05-21 10:15:37 · 706 阅读 · 0 评论 -
Mysql学习-第一章(表设计日期类型)
日期类型常见的日期类型有year,date,time,datetime,timestamep-精确到秒常用datetime,timestamepDATETIME展开形式:YYYY-MM-DD HH:MM:SS 固定占用8字节5.6版本之后支持到毫秒DATETIME(N)表示毫秒的精度,同时,一些日期函数也支持精确到毫秒,例如常见的函数 NOW、SYSDATE:SELECT NOW(6);NOW(6)2021-05-20 09:21:48.762670当我们设计表的时候,有两个字段值,一个是原创 2021-05-20 10:31:41 · 1264 阅读 · 1 评论 -
Mysql学习-第一章(表设计字符串类型)
字符串类型MySQL 数据库的字符串类型有 CHAR、VARCHAR、BINARY、BLOB、TEXT、ENUM、SET。不同的类型在业务设计、数据库性能方面的表现完全不同,其中最常使用的是 CHAR、VARCHAR。CHAR(N) 用来保存固定长度的字符,N 的范围是 0 ~ 255,请牢记,N 表示的是字符,而不是字节。VARCHAR(N) 用来保存变长字符,N 的范围为 0 ~ 65536, N 表示字节。在超出 65536 个字节的情况下,可以考虑使用更大的字符类型 TEXT 或 BLOB,原创 2021-05-19 15:51:59 · 461 阅读 · 1 评论 -
Mysql学习-第一章(表设计数字类型)
表设计数字类型整数类型类型字节大小范围(有符号)范围(无符号)tinyint1-128-1270-255smallint2-32768-327670-65535mediumint3int4BIGINT8其中关键字signed表示有符号,unsigned表示无符号(自然数),建议不要可以使用unsigned原因当设计数据表字段的时候使用unsigned,当分析某条数据的时候,两数相减可能会抛出错误,值有可能小于0.原创 2021-05-19 14:06:30 · 486 阅读 · 1 评论