MySQL上亿数据查询优化:实践与技巧

文章目录

  • MySQL上亿数据查询优化:实践与技巧
    • 一、引言
    • 二、影响查询性能的因素
    • 三、MySQL查询优化的原则
    • 四、索引优化
      • 1. 索引类型
      • 2. 索引设计原则
      • 3. 索引优化实例
    • 五、分区表的使用
      • 1. 分区类型
      • 2. 分区实例
    • 六、查询语句的优化
      • 1. 使用EXPLAIN分析查询
      • 2. 避免使用SELECT *
      • 3. 优化JOIN操作
      • 4. 使用适当的WHERE条件
    • 七、数据库架构的优化
      • 1. 垂直拆分
      • 2. 水平拆分
      • 3. 读写分离
    • 八、实践案例:上亿数据的查询优化
      • 1. 创建示例表
      • 2. 插入测试数据
      • 3. 分析查询性能
      • 4. 优化索引
      • 5. 使用分区表
    • 九、测试接口与详细解释
      • 1. 创建API接口
      • 2. 测试接口
      • 3. 测量查询时间
    • 十、总结

👍 个人网站:【 洛秋小站】

MySQL上亿数据查询优化:实践与技巧

随着大数据时代的到来,数据库管理系统需要处理越来越多的数据。MySQL作为一种流行的关系型数据库管理系统,被广泛应用于各类业务场景。然而,当数据量达到上亿级别时,查询性能可能会显著下降,严重影响应用的响应速度和用户体验。本文将详细介绍MySQL在处理上亿数据时的查询优化技巧,并通过实践案例展示如何有效提升查询性能。

一、引言

MySQL作为一种关系型数据库管理系统,以其易用性、可靠性和高性能被广泛使用。然而,当数据量达到上亿级别时,查询性能可能会显著下降,影响应用的响应速度和用户体验。为了提升查询性能,我们需要深入理解影响查询性能的因素,并应用相应的优化策略。

二、影响查询性能的因素

在讨论查询优化之前,首先需要了解影响查询性能的主要因素:

  1. 硬件配置:包括CPU、内存、磁盘和网络等硬件资源。
  2. 数据库设计:包括表结构设计、索引设计和分区策略等。
  3. 查询语句:包括SQL语句的编写方式、查询逻辑和索引使用等。
  4. 数据库配置:包括MySQL服务器的参数配置,如缓冲区大小、连接数和缓存策略等。

三、MySQL查询优化的原则

在进行查询优化时,应遵循以下原则:

  1. 减少查询数据量:通过优化SQL语句和索引设计,减少需要扫描的数据量。
  2. 减少锁定范围:通过合理的事务控制和索引设计,减少锁定的行数和时间。
  3. 避免全表扫描:通过合理的索引设计,尽量避免全表扫描,提升查询效率。
  4. 利用缓存:充分利用MySQL的查询缓存和操作系统的文件系统缓存,提升查询性能。
  5. 分解复杂查询:将复杂查询分解为多个简单查询,分批次处理数据,提升查询性能。

四、索引优化

1. 索引类型

MySQL支持多种索引类型,包括BTREE、HASH、FULLTEXT和SPATIAL等。在上亿数据的查询优化中,最常用的是BTREE索引。通过合理设计BTREE索引,可以大幅提升查询性能。

2. 索引设计原则

  1. 选择合适的列:选择查询条件中最常用的列作为索引列。
  2. 减少索引数目:索引虽然可以提升查询性能,但过多的索引会影响插入、更新和删除操作的性能。
  3. 覆盖索引:在查询中尽量使用覆盖索引,即查询的字段都在索引中,避免回表查询。
  4. 前缀索引:对于长字符串列,可以使用前缀索引,减少索引的大小。

3. 索引优化实例

假设我们有一个用户表users,包含上亿条数据。表结构如下:

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,email VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

我们经常需要根据usernameemail进行查询。可以通过以下方式优化索引:

ALTER TABLE users ADD INDEX idx_username (username);
ALTER TABLE users ADD INDEX idx_email (email);

五、分区表的使用

分区表是一种将数据分散存储在多个物理子表中的技术,可以有效提升查询性能。MySQL支持多种分区类型,包括RANGE、LIST、HASH和KEY分区。

1. 分区类型

  1. RANGE分区:根据列值的范围进行分区。
  2. LIST分区:根据列值的枚举进行分区。
  3. HASH分区:根据列值的哈希值进行分区。
  4. KEY分区:根据MySQL内部算法进行分区。

2. 分区实例

假设我们有一个日志表logs,包含上亿条数据。表结构如下:

CREATE TABLE logs (id INT AUTO_INCREMENT PRIMARY KEY,message TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

我们可以根据created_at列进行RANGE分区:

CREATE TABLE logs (id INT AUTO_INCREMENT PRIMARY KEY,message TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY RANGE (YEAR(created_at)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023),PARTITION pmax VALUES LESS THAN MAXVALUE
);

六、查询语句的优化

1. 使用EXPLAIN分析查询

MySQL提供了EXPLAIN命令,用于分析查询语句的执行计划。通过EXPLAIN,我们可以了解查询的执行过程,找出优化的方向。

2. 避免使用SELECT *

尽量避免使用SELECT *,只选择需要的列,减少数据传输量。

3. 优化JOIN操作

在进行多表JOIN操作时,确保被连接的列都有索引。使用小表驱动大表,避免笛卡尔积。

4. 使用适当的WHERE条件

在WHERE条件中,尽量使用索引列,避免函数操作和类型转换。

七、数据库架构的优化

1. 垂直拆分

将表中经常一起查询的列放在一个表中,减少单表的列数,提高查询效率。

2. 水平拆分

将大表拆分为多个小表,减少单表的数据量,提高查询效率。

3. 读写分离

将读操作和写操作分离,通过主从复制实现,减少主库的压力,提高查询性能。

八、实践案例:上亿数据的查询优化

接下来,我们通过一个实际案例,展示如何优化上亿数据的查询性能。

1. 创建示例表

首先,我们创建一个包含上亿条数据的订单表orders

CREATE TABLE orders (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,product_id INT NOT NULL,quantity INT NOT NULL,price DECIMAL(10, 2) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 插入测试数据

为了模拟上亿条数据,我们编写一个脚本批量插入数据:

DELIMITER $$CREATE PROCEDURE insert_orders()
BEGINDECLARE i INT DEFAULT 1;WHILE i <= 100000000 DOINSERT INTO orders (user_id, product_id, quantity, price)VALUES (FLOOR(1 + RAND() * 10000), FLOOR(1 + RAND() * 1000), FLOOR(1 + RAND() * 10), FLOOR(1 + RAND() * 1000));SET i = i + 1;END WHILE;
END$$DELIMITER ;CALL insert_orders();

3. 分析查询性能

我们经常需要查询某个用户的订单总数,可以使用以下查询语句:

SELECT COUNT(*) FROM orders WHERE user_id = 12345;

使用EXPLAIN分析查询性能:

EXPLAIN SELECT COUNT(*) FROM orders WHERE user_id = 12345;

4. 优化索引

user_id列添加索引,提升查询性能:

ALTER TABLE orders ADD INDEX idx_user_id (user_id);

再次使用EXPLAIN分析查询性能,可以看到查询效率显著提升。

5. 使用分区表

根据created_at列对订单表进行RANGE分区:

ALTER TABLE orders PARTITION BY RANGE (YEAR(created_at)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023),PARTITION pmax VALUES LESS THAN MAXVALUE
);

通过分区表,可以显著减少查询的数据量,提升查询性能。

九、测试接口与详细解释

为了验证查询优化效果,我们可以编写测试接口,通过API查询订单数据,并测量查询时间。

1. 创建API接口

使用Node.js和Express框架创建一个简单的API接口:

const express = require('express');
const mysql = require('mysql2/promise');const app = express();
const port = 3000;const pool = mysql.createPool({host: 'localhost',user: 'root',password: 'password',database: 'test',waitForConnections: true,connectionLimit: 10,queueLimit: 0
});app.get('/orders/:userId', async (req, res) => {const userId = req.params.userId;try {const [rows] = await pool.query('SELECT COUNT(*) AS orderCount FROM orders WHERE user_id = ?', [userId]);res.json(rows[0]);} catch (err) {res.status(500).json({ error: err.message });}
});app.listen(port, () => {console.log(`Server running at http://localhost:${port}`);
});

2. 测试接口

通过以下命令启动服务器:

node app.js

然后,使用curl命令测试API接口:

curl http://localhost:3000/orders/12345

3. 测量查询时间

在生产环境中,可以使用性能监控工具,如New Relic、Datadog等,实时监测API接口的查询时间和性能表现。

十、总结

在大数据时代,MySQL需要处理上亿级别的数据,查询性能优化显得尤为重要。通过合理的索引设计、分区表的使用、查询语句的优化以及数据库架构的调整,可以显著提升MySQL的查询性能。

👉 最后,愿大家都可以解决工作中和生活中遇到的难题,剑锋所指,所向披靡~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos服务公网环境登陆报密码错误问题排查

作者&#xff1a;小丫 一、问题现象 nacos服务内网可以正常登录&#xff0c;如下&#xff1a; 走公网代理出来之后&#xff0c;无法正常登录&#xff0c;报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路&#xff1a; 域名—>haprox…

Epson打印机日常问题和解决办法

1、打印过程中缺纸&#xff0c;重新放入纸张之后&#xff0c;打印机出错。 打开“控制面板”&#xff0c;进入“设备与打印机”&#xff1a; 选择你正在使用的打印机&#xff0c;最下面可以看到打印机状态&#xff08;我这边用完脱机了&#xff0c;所以显示脱机&#xff09;&a…

【Python实战因果推断】34_双重差分5

目录 Identification Assumptions Parallel Trends No Anticipation Assumption and SUTVA Identification Assumptions 您现在可能已经知道&#xff0c;因果推断是统计工具和假设之间的不断互动。在本文中&#xff0c;我选择从统计工具入手&#xff0c;展示 DID 如何利用单…

数据结构之单链表(赋源码)

数据结构之单链表 线性表 线性表的顺序存储结构&#xff0c;有着较大的缺陷 插入和删除操作需要移动大量元素。会耗费很多时间增容需要申请空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗即使是使用合理的增容策略&#xff0c;实际上还会浪费许多用不上的…

led灯什么牌子的质量好?口碑前五的led灯推荐

每每到开学季&#xff0c;学生们重返校园&#xff0c;各个家长和学生们也迎接新学期的前期准备工作&#xff0c;当然&#xff0c;用眼健康的考量也列位其中&#xff0c;国内的学习压力大一直是众所周知的&#xff0c;学生除了在学校长时间用眼外&#xff0c;短暂的户外休息时间…

为什么有些3d模型不能编辑?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师们面临一个重要的技术挑战&#xff1a;为什么有些3D模型在某些情况下变得难以编辑?这一问题不仅关乎技术操作的复杂性&#xff0c;更深层次地影响着设计工作的效率和成果质量。本文将探讨这一问题的根本原因及其在实际工作中的具体表…

JSONObject和Map<String, Object>的转换

一、前言 Java开发中出参返回和入参传入更灵活的方法是使用Map<String, Object>入参或出参&#xff0c;或者使用JSONObject。 1、好处&#xff0c;参数可变&#xff0c;对接口扩展性很友好。 public ResponseData<WXModelDTO> getUserInfo(RequestBody Map<…

浏览器输入URL后的过程

总体流程&#xff1a; 1. 用户输入URL并按下回车 当用户在浏览器的地址栏中输入一个 URL 并按下回车&#xff0c;浏览器开始解析用户输入并判断这是一个合法的 URL。 2. DNS 解析 缓存查找&#xff1a;浏览器首先查看本地 DNS 缓存中是否有对应的 IP&#xff0c;如果有则直接…

九盾安防丨如何判断叉车是否超速?

在现代物流和生产流程中&#xff0c;叉车是提高效率和降低成本的关键工具。然而&#xff0c;叉车的高速行驶也带来了安全隐患&#xff0c;这就要求我们对其进行严格的安全管理。九盾安防&#xff0c;作为业界领先的安防专家&#xff0c;今天就为大家揭晓如何判断叉车是否超速&a…

Java高频面试基础知识点整理7

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-CNN-LSTM-Mutilhead-Attention北方苍鹰算…

【机器学习】Exam4

实现线性不可分logistic逻辑回归 我们目前所学的都是线性回归&#xff0c;例如 y w 1 x 1 w 2 x 2 b y w_1x_1w_2x_2b yw1​x1​w2​x2​b 用肉眼来看数据集的话不难发现&#xff0c;线性回归没有用了&#xff0c;那么根据课程所学&#xff0c;我们是不是可以增加 x 3 x…

论文翻译:Large Language Models for Education: A Survey

目录 大型语言模型在教育领域的应用&#xff1a;一项综述摘要1 引言2. 教育中的LLM特征2.1. LLMs的特征2.2 教育的特征2.2.1 教育发展过程 低进入门槛。2.2.2. 对教师的影响2.2.3 教育挑战 2.3 LLMEdu的特征2.3.1 "LLMs 教育"的具体体现2.3.2 "LLMs 教育"…

linux——线程

线程概念 什么是线程&#xff1f; 在一个程序里的一个执行流叫做线程。一切进程至少有一个线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#xff0c;在CPU眼中&#xff0c;看到的PCB都要比传统的进程更加轻量化 我们都知道在每一个进程都有属…

Ubuntu 22.04.4 LTS (linux) Auditd 安全审计rm命令 记录操作

1 audit增加rm 规则 #sudo vim /etc/audit/rules.d/audit.rules -w /bin/rm -p x -k delfile #重新启动服务 sudo systemctl restart auditd #查看规则 sudo auditctl -l -w /bin/rm -p x -k delfile 2 测试规则 touch test.txt rm test.tx 3 查看日志 sudo ausear…

Apache-Flink未授权访问高危漏洞修复

漏洞等级 高危漏洞!!! 一、漏洞描述 攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通过直接输入网站控制台主页面地址,或者不允许查看的链接便可进行访问,同时进行操作。 二、修复建议 根据业务/系统具体情况,结合如下建议做出具体选择: 配…

无人机之遥控器分类篇

一、传统遥控器 传统无人机遥控器一般包括开关键、遥控天线等基础装置。但是会随着无人机具体的应用和功能而开发不同的按键。它的信号稳定性远超对比其他遥控&#xff0c;而且遥控距离也更远&#xff08;一般遥控范围在100米或以上&#xff09;传统遥控器对于初学者来说比较难…

在uniapp中如何使用地图

1&#xff0c;技术选择 最好是使用webview html形式加载&#xff0c;避免打包app时的地图加载问题 2&#xff0c;webview使用 使用webview必须按照官方文档,官网地址&#xff1a;https://uniapp.dcloud.net.cn/component/web-view.html <template><view><!…

KNN分类算法与鸢尾花分类任务

鸢尾花分类任务 1. 鸢尾花分类步骤1.1 分析问题&#xff0c;搞定输入和输出1.2 每个类别各采集50朵花1.3 选择一种算法&#xff0c;完成输入到输出的映射1.4 第四步&#xff1a;部署&#xff0c;集成 2. KNN算法原理2.1 基本概念2.2 核心理念2.3 训练2.4 推理流程 3. 使用 skle…