Mysql主从解决什么问题,不能解决什么问题?

MySQL主从同步,主负责写,从负责读,使用一主多从,能减轻读的压力

但是这不能解决写的压力和主库的单点故障,如果主库的写并发高,可以做成多个主库

MySql主从复制原理?

主要依靠binlog来实现的,它记录的是所有的DDL,DML,TCL操作

当主库的数据发生改变时,会将改变记录保存到binlog中

从库新开一个线程将binlog内容发送到从库

从库会发起一个I/O线程请求主库的binlog,并保存到中继日志中

从库新开一个SQL线程,读取中继日志并解析成具体操作,从而将主库更新的内容写到了从库中

MySql主从配置步骤?

安装mySQL主从客户端,并配置my.ini

主库需要配置授权从库使用的账号和权限,启动后可以通过show 主库名 status查看状态,我们需要记录File和Position的值,File是对应的binlog文件名,position是当前同步数据的最新行

从库需要配置主库链接信息,包括账号密码和binlog文件名和最新行,然后启动。通过show 从库名 status 检查同步状态,Slave_IO_Running 和 Slave_SQL_Running 的值都为YES,说明大功告成了

什么是垂直分表,垂直分库,水平分表,水平分库

垂直分表,可以理解为按列分表,如果一个表的字段太多了,可以按照使用频率分成不同的表,优化查询性能。比如商品表可以分为商品类型表,商品详情表,商品促销表等等

垂直分库,为了减轻单个数据库压力,我们可以按照业务类型,拆分成多个数据库,比如分布式架构,不同的模块可以有不同的数据库

水平分表,可以理解为按行分表,如果一个表的数据有千万行,查询性能太低,可以拆分成10张小表,每张表保存一百万行数据

水平分库,我们做了水平分表后,表数量太多了也会影响数据库查询效率,我们可以将这些表分到多个数据库中

分库分表后会出现哪些问题?怎么解决

会产生分布式事务,以前本地事务就能结局的问题现在要用上Seata分布式事务

垂直分库后跨库查询会导致一个查询结果来源于两个库,可能要用到多线程调用多个库查询

水平分库后一个分页查询的某一页可能来自两个库,可以将两个库的数据合并之后再执行SQL

水平分表后不同的表出现主键重复,可以通过雪花算法来解决

两个库都用到同一个表,那这个公共表的维护可能要用到MySQL主从同步

你们公司使用的是什么技术来水平分表?还可以有什么技术?有什么区别?

使用的是sharding-jdbc来实现的,它是由java开发的关系型数据库中间件,读写分离,分库分表操作简单

TDDL,淘宝业务框架,复杂而且分库分表的部分还没有开源

Mycat,要安装额外的环境,不稳定用起来复杂

MySQL官方提供的中间件,不支持大数据量的分不分表,性能较差

你们使用什么规则来分库分表的?还有哪些规则?

垂直分库,按照业务进行垂直分库,比如课程表和用户表放到不同数据库

垂直分表,把多字段表拆分少量字段表,比如将课程表分为课程类型表,课程详情表,课程促销表等

水平分表,把海量数据表拆分为多个小表

把商品业务进行水平分库,可以对水平分库后每一个数据库服务器进行集群

你从哪些方面去优化你的数据库?

如果是并发高,可以考虑缓存,如果是数据量大可以考虑分库分表,具体如下:

首先应该考虑垂直分库,不同的业务使用不同的数据库

然后进行垂直分表,按照使用频率把字段多的表拆分成若干个表

对经常查询的列建立索引,提高查询效率

设计冗余字段,减少join表的次数

SQL优化,比如尽量使用索引查询

对热点数据应该考虑做缓存,比如首页展示汇总数据

从海量数据中查询数据应该考虑用全文检索

如果查询并发高,可以对mySQL做集群

如果数据量实在太大了,可以考虑水平分表,

水平分表后,表数量还是太多了,可以考虑水平分库

Mysql的集群有哪些模式?

一主一从;一主多从;双主;环形多主;级联同步

单机优化到极致了,可以怎么优化?

可以考虑做集群,比如一主多从模式,然后对应用做读写分离

多机优化有哪些方式?

分表,分库,主从同步

解释一下分库分表的含义?

垂直分表,可以理解为按列分表,如果一个表的字段太多了,可以按照使用频率分成不同的表,优化查询性能。比如商品表可以分为商品类型表,商品详情表,商品促销表等等

垂直分库,为了减轻单个数据库压力,我们可以按照业务类型,拆分成多个数据库,比如分布式架构,不同的模块可以有不同的数据库

水平分表,可以理解为按行分表,如果一个表的数据有千万行,查询性能太低,可以拆分成10张小表,每张表保存一百万行数据

水平分库,我们做了水平分表后,表数量太多了也会影响数据库查询效率,我们可以将这些表分到多个数据库中

水平分表有哪些分表规则?

按照区间范围分表,比如把用户按照年龄分为新生代表,青年代表,老年代表

按照时间分表,比如按照年来分表,比如登录日志,分成今年的表,去年的表。。

hash分表,通过将某一列的值比如id,通过一定的hash算法来算出对应那张表

雪花算法,通过雪花算法生成id,根据id来算出对应那张表

能简单说一下你怎么使用shardingjdbc做读写分离的嘛

首先导入相关的依赖

然后在配置文件中配置datasource,包括主从数据库的名字,主从数据库的连接信息,配置负载均衡

项目中就可以正常使用datasource了,自动做读写分离

能简单说一下你怎么使用shardingjdbc做读分库分表的嘛

首先,要改造数据库,比如水平分表,水平分库

在配置文件中,需要做如下配置

  • datasource名字,多个数据源就配多个datasource
  • 分库策略,比如按照哪一列分库,分库规则
  • 分表策略,比如哪些库下面的哪些表,按照那一列分表,分表规则
  • 配置公共的表

然后项目中就可以正常使用了