常见问题
分库分表
对于海量数据,且有一定的并发量的分库分表,绝不是引入某一个分库分表中间件就能解决问题,而是一项系统的工程。需要分析整个表相关的业务,让合适的中间件做它最擅长的事情。例如有sharding column的查询走分库分表,一些模糊查询,或者多个不固定条件筛选则走es,海量存储则交给HBase。
做了这么多事情后,后面还会有很多的工作要做,比如数据同步的一致性问题,还有运行一段时间后,某些表的数据量慢慢达到单表瓶颈,这时候还需要做冷数据迁移。
参考文档
https://www.cnblogs.com/twoheads/p/10715498.html
缓存
mysql
官方资料
https://dev.mysql.com/doc/refman/8.0/en/
整体架构
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中的某个值建立索引而不用在表上加减字段
选择:
如果对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
数据库中间件
分类
主要是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
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、分片规则:前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难
优势
基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。
完全实现分布式事务,完全的支持分布式。
通过Mycat web(eye)完成可视化配置,及智能监控,自动运维。
通过mysql 本地节点,完整的解决数据扩容难度,实现自动扩容机制,解决扩容难点。
支持基于zookeeper的主从切换及Mycat集群化管理。
通过Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集群节点的动态上下线。
接入Spark等第三方工具,解决数据分析及大数据聚合的业务场景。
通过Mycat智能优化,分析分片热点,提供合理的分片建议,索引建议,及数据切分实时业务建议
1.6版本架构
基于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中大致分为两部分:事务管理器和本地资源管理器
分为两个协议: 两阶段协议和三阶段协议
三阶段协议.
相比于两阶段的优势:
- 协调器和参与者加入了超时机制
2. 准备阶段拆分为两阶段,防止参与者在准备后发生奔溃无法知晓是否提交或回滚的不确定状态所引起的延时和数据不一致问题。
- 在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做了重大修改
语言从c到c++的变更
完全开源
价格是mysql 的一半,目标云市场
瞄准高可用,修改一些已知的bug