This commit is contained in:
2025-09-09 21:26:01 +08:00
parent 5b2dbfd379
commit a6ba165721
3 changed files with 111 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -78,4 +78,64 @@ SELECT p.* FROM products p INNER JOIN (
### 使用es ### 使用es
直接上elasticsearch利用它本身分页的特性进行优化。 直接上elasticsearch利用它本身分页的特性进行优化。
---
```SQL
use pages;
-- 创建商品表
CREATE TABLE `products` (
`id` BIGINT AUTO_INCREMENT COMMENT '自增主键ID',
`product_name` VARCHAR(255) NOT NULL COMMENT '商品名称',
`category_id` INT NOT NULL COMMENT '分类ID',
`price` DECIMAL(10, 2) NOT NULL COMMENT '价格',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
-- 在排序字段上创建索引,这是至关重要的
CREATE INDEX `idx_created_at` ON `products` (`created_at`);
-- (可选)创建一个更实用的联合索引,例如按分类查找再按时间排序
CREATE INDEX `idx_category_created` ON `products` (`category_id`, `created_at`);
-- 修改MySQL的语句结束符以便在存储过程中使用分号
DELIMITER $$
-- 创建一个名为 insert_mock_products 的存储过程
CREATE PROCEDURE `insert_mock_products`(IN insert_count INT)
BEGIN
-- 定义一个循环计数器
DECLARE i INT DEFAULT 1;
-- 开始循环
WHILE i <= insert_count DO
INSERT INTO `products` (
`product_name`,
`category_id`,
`price`,
`created_at`
) VALUES (
-- 生成一个像 'Product 123' 这样的随机商品名
CONCAT('Product ', i),
-- 生成一个 1 到 50 之间的随机分类ID
FLOOR(1 + RAND() * 50),
-- 生成一个 10.00 到 1000.99 之间的随机价格
ROUND(10 + RAND() * 990.99, 2),
-- 生成一个从现在开始,逐步往前推移的时间,确保时间戳的唯一和顺序性
-- 这里用秒作为递减单位,可以确保排序的稳定性
DATE_SUB(NOW(), INTERVAL i SECOND)
);
-- 计数器加1
SET i = i + 1;
END WHILE;
END$$
-- 将语句结束符恢复为默认的分号
DELIMITER ;
-- 调用存储过程,并传入你想要插入的数据量
CALL insert_mock_products(1000000);
```

View File

@@ -0,0 +1,50 @@
---
title: 什么是MySQL的主从同步机制
published: 2025-09-09
description: ''
image: ''
tags: ['MySQL', '主从同步']
category: '中间件 > MySQL'
draft: false
lang: ''
---
# 什么是MySQL的主从同步机制
MySQL的主从同步机制是一种数据复制技术用于将住数据库上的数据同步到一个或者多个从数据库中。
主要是通过二进制日志 binlog 实现数据的复制。
主数据库在执行写操作的时候会把这些操作记录在binlog里面然后推送给从数据库从数据库重放对应的日志即可完成复制。
# MySQL主从复制类型
MySQL支持异步复制同步复制半同步复制
异步复制: 主库不需要等待从库的响应(性能高,一致性低)
同步复制: 主库同步等待所有从库确认收到的数据(性能差,一致性高)
半同步复制: 主库等待至少一个从库确认收到数据(性能折中,数据一致性比较高)
## 异步复制
![](https://blog.meowrain.cn/api/i/2025/09/09/y283pk-1.webp)
MySQL默认是异步复制。
# 主从复制流程
1. 线程创建从服务器创建一个IO线程一个SQL线程IO线程负责读取主服务器上的binlog并写入到本地relay log中SQL线程负责读取relay log中的日志并执行到从服务器上
2. 连接建立: 从服务器的IO线程与主服务器建立连接主服务器的binlog dump线程和从服务器的IO线程进行交互
3. 从服务器的IO线程告诉主服务器开始日志传送的对应位置
4. 主服务器更新的时候把记录保存到binlog中
5. 主服务器dump线程检测到binlog变化从指定位置开始读取从服务器进行拉取。
6. 中继日志存储: 从服务器的IO线程把接收到的内容保存到relay log中
7. 数据写入: 从服务器的SQL线程读取relay log中的内容进行数据写入。
# 主从复制延迟
主从复制延迟是指主服务器和从服务器之间数据同步的时间差。
主从复制延迟的原因有很多例如网络延迟主服务器和从服务器之间的硬件差异主服务器和从服务器之间的操作系统差异主服务器和从服务器之间的MySQL版本差异主服务器和从服务器之间的MySQL配置差异等。
解决方法:
优化网络
提高从服务器性能
利用MySQL并行复制功能提升效率减少延迟。https://blog.csdn.net/weixin_42587823/article/details/144842206