数据库小结

常见问题

分库分表

对于海量数据,且有一定的并发量的分库分表,绝不是引入某一个分库分表中间件就能解决问题,而是一项系统的工程。需要分析整个表相关的业务,让合适的中间件做它最擅长的事情。例如有sharding column的查询走分库分表,一些模糊查询,或者多个不固定条件筛选则走es,海量存储则交给HBase。

做了这么多事情后,后面还会有很多的工作要做,比如数据同步的一致性问题,还有运行一段时间后,某些表的数据量慢慢达到单表瓶颈,这时候还需要做冷数据迁移。

参考文档

https://www.cnblogs.com/twoheads/p/10715498.html

缓存

image
image
image
image
image
image
image
image
image
image
image

mysql

image
image
image

官方资料

https://dev.mysql.com/doc/refman/8.0/en/

整体架构
image
SQL层的功能

select * from wordpress.user;

DDL 数据库定义语言

DCL 数据库控制语言

DML 数据库操作语言

DQL 数据查询语言

1、判断语法、语句、语义

判断语句类型 2、数据库不能直接响应sql语句

必须明确的知道数据在哪个磁盘  3、数据库对象授权情况判断

授权失败不继续4、解析(解析器)

将sql语句解析成执行计划,运行执行计划,生成找数据的方式5、优化 (优化器)

运行执行计划

5.6之后 基于代价的算法,从执行计划中选择代价最小的交给"执行器"6、"执行器" 运行执行计划

最终生产如何去磁盘找数据方式7、将取数据的方式,交由下层(存储引擎层)进行处理8、最终将取出的数据抽象成管理员或用户能看懂的方式(表),展现在用户面前9、查询缓存: 缓存之前查询的数据。

假如我们查询的表是一个经常有变动的表,查询缓存不要设置太大
存储引擎

存储引擎用于:

存储数据、检索数据、通过索引查找数据

    存储介质、  事务功能、  锁定、备份和恢复、优化

特殊功能:

全文搜索、引用完整性、空间数据处理

双层处理

上层包括SQL解析器和优化器、下层包含一组存储引擎

SQL 层不依赖于存储引擎:

引擎不影响SQL处理

版本信息

1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。

2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天。

3. MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。

4. MySQL Cluster CGE 高级集群版,需付费。

5. MySQL Workbench(GUITOOL)一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。MySQLWorkbench又分为两个版本,分别是社区版(MySQL Workbench OSS)、商用版(MySQL WorkbenchSE)。

版本特性

功能

MySQL数据库从5.7.8版本开始,也提供了对JSON的支持。对比PG和mysql:

1. 在共有功能上,pg比mysql要快一些

2. pg比mysql多一些操作json的函数

3. pg自定义函数功能比较强,针对json操作可以较好地进行模块化开发,不一定要全部揉在一个sql里

4. pg支持函数索引,这样可以对json中的某个值建立索引而不用在表上加减字段

image

选择:

如果对json有频繁的操作,而且需要复杂的操作,现阶段来说pg是你唯一的选择

如果对json操作功能性要求比较少,并且对其操作的强度也不高,建议选择最熟悉的数据库

一切都是发展的,说不定未来mysql对json的支持会越来越好,所以如果没必要,选择自己/团队最熟悉的数据库

pg的json和jsonb

从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型。jsonb格式是json的二进制形式,二者的区别在于json写入快,读取慢,jsonb写入慢,读取快,但在操作上,二者是没有区别的

(1)json存储快,使用慢; 存的时候不做处理,使用时再解析

(2)jsonb存储稍慢,存储时就做了解析,使用时速度较快

(3)两者的部分函数很相似,稍有区别

generate column, generated column是MySQL 5.7引入的新特性,所谓generated column,就是数据库中这一列由其他列计算而得。

性能

在MySQL 5.7中,性能相关的改进非常多,包括临时表相关的性能改进、只读事务的性能优化、连接建立速度的优化和复制性能的改进。

临时表的性能改进

MySQL 5.7 为了提高临时表相关的性能,对临时表相关的部分进行了大幅修改,包括引入新的临时表空间;对于临时表的DDL,不持久化相关表定义;对于临时表的DML,不写redo,关闭change buffer等。所有临时表的改动,都基于以下两个事实 :

1.临时表只在当前会话中可见

2.临时表的生命周期是当前连接(MySQL宕机或重启,则当前连接结束)

也就是说,对于临时表的操作,不需要其他数据一样严格地进行一致性保证。通过不持久化元信息,避免写redo等方式,减少临时表操作的IO,以提高临时表操作的性能。

可用性

在线设置 复制的过滤规则 不再需要重启MySQL,只需要停止SQL thread,修改完成以后,启动SQL thread

在线修改buffer pool的大小

Online DDL MySQL 5.7支持重命名索引和修改varchar的大小,这两项操作在之前的版本中,都需要重建索引或表

ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);

在线开启GTID ,在之前的版本中,由于不支持在线开启GTID,用户如果希望将低版本的数据库升级到支持GTID的数据库版本,需要先关闭数据库,再以GTID模式启动,所以导致升级起来特别麻烦。MySQL 5.7以后,这个问题不复存在

高可用方案

点击链接进入:高可用方案

mysql常见命令

常见命令

索引

索引

分布式事务

分布式事务

分布式数据库中间件

分布式数据库中间件

参数理解

系统默认参数

数据库版本:mysql Ver 14.14 Distrib 5.7.27-30, for Linux (x86_64) using 6.2

事务隔离级别

tx_isolation | REPEATABLE-READ

transaction_isolation | REPEATABLE-READ

线程池大小

| thread_pool_size | 2 |

| thread_pool_stall_limit | 500

| thread_pool_high_prio_tickets | 4294967295 |

| thread_pool_idle_timeout | 60 | thread_pool_max_threads | 100000

binlog三种复制方式

二进制binlog的格式有三种:

statement:基于sql的binlog,每条修改数据的sql都会保存到binlog里。

row:基于行级别,记录每一行数据的变化,也就是将每一行数据的变化都记录到binlog里,记录非常详细。

mixed:混合statement和row模式。

WAL

WAL介绍

数据库中间件

分类

主要是mysql proxy,Amoeba, mycat 和 shardding jdbc

Mysql proxy

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。

mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等

MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,

从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。

当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。

Amoeba

下载地址: http://sourceforge.net/projects/amoeba/files/

Amoeba主要解决以下问题:

a). 数据切分后复杂数据源整合

b). 提供数据切分规则并降低数据切分规则给数据库带来的影响

c). 降低数据库与客户端连接

d). 读写分离路由

不足

a)、目前还不支持事务

b)、暂时不支持存储过程(近期会支持)

c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)

d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:

更多信息参考://www.greatytc.com/p/4aec9f682509

shardding jdbc

//www.greatytc.com/writer#/notebooks/29164998/notes/54241036

Mycat

官方地址:http://www.mycat.org.cn/

github地址:https://github.com/MyCATApache/Mycat-Server

依赖关系速阅览:https://github.com/MyCATApache/Mycat-Server/blob/1.6/pom.xml

主要功能

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

原理

**MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法 **

**1.Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。 **

**2.Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。 **

**3.DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上 **

4.DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上

5、分片规则:前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难

image

优势

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。

长期规划2.0

完全实现分布式事务,完全的支持分布式。

通过Mycat web(eye)完成可视化配置,及智能监控,自动运维。

通过mysql 本地节点,完整的解决数据扩容难度,实现自动扩容机制,解决扩容难点。

支持基于zookeeper的主从切换及Mycat集群化管理。

通过Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集群节点的动态上下线。

接入Spark等第三方工具,解决数据分析及大数据聚合的业务场景。

通过Mycat智能优化,分析分片热点,提供合理的分片建议,索引建议,及数据切分实时业务建议

1.6版本架构

image

基于spring链接主从模式的服务端

https://blog.csdn.net/kingmax54212008/article/details/83716753

索引

组合索引

遵循左相关原则,与最左边关联系最强为原则。

举例如下:

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

city VARCHAR(50) NOT NULL,

age INT NOT NULL

);

ALTER****TABLE mytable ADD****INDEX name_city_age (name(10),city,age);
如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

usernname,city,age

usernname,city

usernname

相关参考:

https://blog.csdn.net/weixin_42181824/article/details/82261988

https://baijiahao.baidu.com/s?id=1615219189673304134&wfr=spider&for=pc

secondary index

除了聚簇索引之外的其他索引类型都属于二级索引。在Innodb中,二级索引的每行数据都包含这条数据的主键列,还有二级索引指定的列;聚簇索引中,innodb通过主键值来查找数据行。

mysql索引回表概念

(1)先通过普通索引(普通索引,唯一索引,组合索引)定位到主键值;

(2)在通过聚集索引定位到行记录;

这就是所谓的回表查询,先定位主键值,再定位行记录,然后根据行记录数主键id扫描索引数,查询出数据,它的性能较扫一遍索引树更低

举例说明:当有一个表有四个字段,分别是id、name,age、address四个字段,将id设置为主键索引,将name和age设置为组合索引

查询语句如下:

select name, age, address from table where name = xxx and age = xxx

得出结论如下:根据组合索引规范,最左原则和用法,其实组合索引用到了。但是address字段没有建立索引,根据已经通过索引查询出的记录的主键id,根据主键id在去遍历索引树获取数据,这个过程就叫做回表。

如果查询语句变化下:

select id, name, age from table where name = xxx and age = xxx

得出结论如下:因为id已经有索引,所以不需要回表,那么这就是覆盖索引。

索引优化

全值匹配心上人(这是基本原则),最左前缀要遵行(联合索引一般都围绕最左前缀优化);

带头大哥活才行(联合索引从最左边字段开始使用),中间兄弟规矩行(不能跳过中间的字段,跳过后索引无效);

索引列上少计算(索引列上尽量不要进行计算),范围之后全完蛋(where后面使用范围查询的之后的索引无效);

like百分最右写(%号写最右边,写左边会导致索引失效),覆盖索引别写星(尽量避免select*这样的语句,能写索引列最好);

空值不等还有or,索引失效最无情(is null,is not null,!=,<>,or会导致索引无效);

https://blog.csdn.net/yhl_jxy/article/details/88636685

更全面的

//www.greatytc.com/p/21c9a9ee7a90

索引执行

从源码来看
https://blog.csdn.net/vipshop_fin_dev/article/details/79688717

分布式事务

协议

分布式基础协议:CAP, BASE

分布式事务协议或框架:XA,TCC,saga,本地消息表+最终一致性

XA协议

XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器

分为两个协议: 两阶段协议和三阶段协议

三阶段协议.

相比于两阶段的优势:

  1. 协调器和参与者加入了超时机制

2. 准备阶段拆分为两阶段,防止参与者在准备后发生奔溃无法知晓是否提交或回滚的不确定状态所引起的延时和数据不一致问题。

  1. 在precommit阶段等待超时后会直接提交,解决了二阶段单点故障后一直等待占用资源的问题。

遗留的问题:

当第三个阶段准备发起abort时,事务协调器出现故障,会导致数据不一致

相关参考

https://www.cnblogs.com/cxxjohnson/p/9145548.html

存储引擎

常见引擎:XtraDB MyISAM InnoDB NDB

XtraDB
优点:

可扩展性:处理更多事务;在强大的服务器上进行扩展

性能:使用了XtraDB的Percona Server速度非常快,事务处理能力是innodb的2.7倍。

可靠性:避免损坏,提供崩溃安全(crash-safe)复制

管理:在线备份,在线表格导入/导出

诊断:高级分析和检测

灵活性:可变的页面大小,改进的缓冲池管理

产品Percona 和MariaDB
percona开发了xtraDB存储引擎。mariaDB使用了XtraDb,同时也提供myisam和innodb,是mysql的替代品,由mysql的创建者Monty Widenius成立一个家非盈利公司维护,公司由产品驱动,后续的发展具有不可确定性。

MariaDB
另一款提供了XtraDB存储引擎的产品是MariaDB产品。它与Percona产品非常类似,但是提供了更多底层代码更改,试图提供比标准MySQL更多的性能改进。MariaDB直接利用来自Percona的XtraDB引擎,由于它们使用的是完全相同的引擎,因此每次使用存储引擎时没有显著的差别。

产品Drizzle
mysql的一分支,对mysql做了重大修改

  1. 语言从c到c++的变更

  2. 完全开源

  3. 价格是mysql 的一半,目标云市场

  4. 瞄准高可用,修改一些已知的bug

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容