diff --git a/public/api/i/2025/09/09/y283pk-1.webp b/public/api/i/2025/09/09/y283pk-1.webp new file mode 100644 index 0000000..83f21b8 Binary files /dev/null and b/public/api/i/2025/09/09/y283pk-1.webp differ diff --git a/src/content/posts/中间件/MySQL/MySQL中如何解决深度分页问题.md b/src/content/posts/中间件/MySQL/MySQL中如何解决深度分页问题.md index e3e8a8e..1f47764 100644 --- a/src/content/posts/中间件/MySQL/MySQL中如何解决深度分页问题.md +++ b/src/content/posts/中间件/MySQL/MySQL中如何解决深度分页问题.md @@ -78,4 +78,64 @@ SELECT p.* FROM products p INNER JOIN ( ### 使用es -直接上elasticsearch,利用它本身分页的特性,进行优化。 \ No newline at end of file +直接上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); +``` diff --git a/src/content/posts/中间件/MySQL/什么是MySQL的主从同步机制.md b/src/content/posts/中间件/MySQL/什么是MySQL的主从同步机制.md new file mode 100644 index 0000000..4c9b637 --- /dev/null +++ b/src/content/posts/中间件/MySQL/什么是MySQL的主从同步机制.md @@ -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 \ No newline at end of file