# MySQL高扩展和高可用

* [真题](https://www.kancloud.cn/ranjun940726/php_interview/596349#_2)

* [分区表的原理](https://www.kancloud.cn/ranjun940726/php_interview/596349#_6)

* [工作原理](https://www.kancloud.cn/ranjun940726/php_interview/596349#_9)

* [使用场景](https://www.kancloud.cn/ranjun940726/php_interview/596349#_16)

* [限制](https://www.kancloud.cn/ranjun940726/php_interview/596349#_24)

* [分库分表的原理](https://www.kancloud.cn/ranjun940726/php_interview/596349#_36)

* [工作原理](https://www.kancloud.cn/ranjun940726/php_interview/596349#_38)

* [使用场景](https://www.kancloud.cn/ranjun940726/php_interview/596349#_41)

* [分表方式](https://www.kancloud.cn/ranjun940726/php_interview/596349#_46)

* [水平分割](https://www.kancloud.cn/ranjun940726/php_interview/596349#_48)

* [垂直分割](https://www.kancloud.cn/ranjun940726/php_interview/596349#_62)

* [分表的缺点](https://www.kancloud.cn/ranjun940726/php_interview/596349#_74)

* [延伸:MySQL的主从复制原理及负载均衡](https://www.kancloud.cn/ranjun940726/php_interview/596349#MySQL_80)

* [MySQL的主从复制原理](https://www.kancloud.cn/ranjun940726/php_interview/596349#MySQL_82)

* [主从复制解决的问题](https://www.kancloud.cn/ranjun940726/php_interview/596349#_87)

# 真题

简述MySQL分表操作和分区操作的工作原理,分别说说分区和分表的使用场景和各自的优缺点。

# 分区表的原理

## 工作原理

对用户而言,分区表是一个独立的逻辑表,但是底层 MYSQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件。

创建表时使用`partition by`子句定义每个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询只需要查询所需数据在的分区。

分区的主要目的是将数据按照一个较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且如果想一次性删除整个分区的数据也很方便。

## 使用场景

* 表非常大,无法全部存在内存,或者只在表的最后有热点数据其他都是历史数据

* 分区表的数据更易维护,可以对独立的分区进行独立的操作

* 分区表的数据可以分布在不同的机器上,从而高效使用资源

* 可以使用分区表来避免某些特殊的瓶颈

* 备份和恢复独立的分区

## 限制

* 一个表最多只能有`1024`个分区

* MySQL 5.1 版本中,分区表表达式必须是整数,5.5可以使用列分区

* 分区字段中如果有主键和唯一索引列,那么主键列和唯一索引列都必须包含进来;

* 分区表中无法使用外键约束

* 需要对现有表的结构进行修改

* 所有分区都必须使用相同的存储引擎

* 分区函数中可以使用的函数和表达式会有一些限制

* 某些存储引擎不支持分区

* 对于MyISAM的分区表,不能使用`load index into cache`

* 对于MyISAM表,使用分区表时需要打开更多的文件描述符

# 分库分表的原理

## 工作原理

通过一些`hash`算法或工具实现将一张数据表垂直或者水平进行物理分割。

## 使用场景

* 单条记录条数达到百万到千万级别

* 解决表锁的问题

## 分表方式

### 水平分割

表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度

![](https://box.kancloud.cn/04ee305aba0f24b86d567ff6b99042b8_548x306.png)

**使用场景**

* 表中的数据本身就有独立性,例如表中分别记录各个地区的数据或者不同时期的数据,特别是有些数据常用,有些不常用

* 需要把数据存放在多个介质上

**水平分表缺点**

* 给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需 UNION操作

* 在许多数据库应用中,这种复杂性会超过它带来的优点,查询时会增加读一个索引层的磁盘次数

### 垂直分割

把主键和一些列放在一个表,然后把主键和另外的列放在另一张表中。

![](https://box.kancloud.cn/aef436c3d747ff3dbf8edf54b3384305_579x411.png)

**使用场景**

* 如果一个表中某些列常用,而另外一些列不常用

* 可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数

**垂直分表缺点**

* 管理冗余列,查询所有数据需要`join`操作

## 分表的缺点

* 有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差

* 对于应用层来说,逻辑算法无疑增加开发成本

# 延伸:MySQL的主从复制原理及负载均衡

## MySQL的主从复制原理

* 在**主库**上把数据库上把更改记录到**二进制日志**

* **从库**将**主库的日志复制**到自己的**中继日志**

* **从库**读取**中继日志**中的事件,将其重放在**从库**数据库中

### 主从复制解决的问题

* 数据分布:随意停止或开始复制,并在不同地理位置分布数据备份

* 负载均衡:降低单个服务器的压力

* 高可用和故障切换:帮助应用程序避免单点失败

* 升级测试:可以使用更高版本的 MYSQL作为从库

mysql应用层透明扩展_MySQL高扩展和高可用相关推荐

  1. mysql主从进行扩展_MySQL 主从扩展

    MySQL 主从扩展 常见问题排查 1. 数据不一致:SHOW SLAVE STATUS \G; Last_Errno:1062 Last_Error:Error'Duplicate entry'xx ...

  2. mysql 分表后如何扩展_MySQL横向扩展-分库分表解决方案总结

    从业务场景看分库分表 互联网行业中,业务场景通常写少读多的情况居多,在MySQL的使用前期,读性能大多可以通过SQL优化来解决,但随着业务的持续发展,单纯依靠SQL的查询优化会越来越难以达到业务服务要 ...

  3. 高并发(水平扩展,垂直扩展)

    转自:https://www.jianshu.com/p/be66a52d2b9b 一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是 ...

  4. 高性能,高扩展,高可用架构

    原文链接:https://www.zhihu.com/question/421237964/answer/1795200233 作者:Lowry​ 如何理解高并发? 高并发系统设计的目标是什么? 高并 ...

  5. 全面认识高并发:高性能、高可用、高扩展

    Table of Contents 01 如何理解高并发? 02 高并发系统设计的目标是什么? 2.1 宏观目标 2.2 微观目标 ❇ 性能指标 ❇ 可用性指标 ❇ 可扩展性指标 03 高并发的实践方 ...

  6. FastAdmin扩展PHPEXCEL,PHP7.3高版本兼容问题

    THINKPHP扩展PHPEXCEL与PHP7.3高版本兼容问题 框架:THINKPHP5,PHPEXCEL版本:1.81 无法导出EXCEL原因为Shared/OLE.php第290行使用conti ...

  7. Docker安装PHP-FPM5.6 (自带redis扩展,Mysql扩展,GD库扩展(支持JEPG))

    打包一个安装好reids扩展,GD库扩展,mysql扩展的PHP-FPM(php 5.6)版本,镜像地址及安装步骤如下 1,下载镜像: docker pull zlilizh/phpfpm5.6:la ...

  8. 如何使用高扩展组件制作APP原型的标签栏?

    原型项目中的组件(亦称元件.控件),是指通过基础图层拼装而成,可供用户进行交互或用于展示复杂内容的元素. 在原型设计工作中,组件的使用是非常重要的部分,其不仅关乎项目内容的呈现,更会影响编辑操作效率. ...

  9. 保证系统三高:高可用、高性能、高扩展

    高性能包括高并发.低延迟. 高并发: 谷歌搜索:what is high concurrency 垂直扩展.水平扩展方向: https://topic.alibabacloud.com/a/high- ...

最新文章

  1. mysql根据两列去重复_mysql对两列去重复数据库
  2. sharepoint 不同路径下 COOKIE找不到
  3. Eclipse 插件开发 向导
  4. 蓝桥杯第八届省赛JAVA真题----正则问题
  5. php各种加密特征,php 开发中加密的几种方法总结
  6. 蓝桥杯 ALGO-22算法训练 数的划分
  7. 【js】js传递对象
  8. JAVA EE 课程目标
  9. android 阿拉伯语下布局,android设计的布局在阿拉伯语下界面错乱的解决方法
  10. 航空429接口测试工装研究
  11. 前端开发应该如何准备面试
  12. Maxtang大唐英特尔12代J6412无风扇双网口迷你主机真实评测
  13. MySQL索引重复插入数据报错
  14. 如何用记事本写Java程序
  15. 树形表格TreeGrid
  16. C++11 std::thread-使用lambda表达式-GCC 4.9编译通过
  17. 咸鱼看书之《射频与微波电子学》(3:电路学数学基础之:相量)
  18. linux账号密码输入没反应,linux 主机上出现输入正确的账号和密码,无法登陆,如何操作...
  19. 如何做一个基于python校园鲜花水果商城系统毕业设计毕设作品(Django框架)
  20. 【读书笔记】《文案变现》——写出有效文案的四个黄金步骤

热门文章

  1. highgui java opencv_OpenCV在C Qt应用程序中的highgui
  2. VUE3.x(v-for)循环遍历指令
  3. matplotlib之plot,figure(笔记一)
  4. python基础(笔记)
  5. wpf datagrid 表格内容自动计算_施工测绘20套测量自动计算表格,无脑输入数据出结果...
  6. python读取linux内存_使用python获取CPU和内存信息(linux系统)
  7. linux端口转发_详解Linux网桥功能--概念、工作机制、相关命令及实例说明
  8. Ceph (1) - 安装Ceph集群方法 1:使用ceph-deploy安装Nautilus版Ceph集群
  9. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(7-9)
  10. 马化腾加持开源,参与构建全球科技共同体