当前位置: 首页 > article >正文

MYSQL---------SQL 应用优化

SQL 应用优化

使用连接池

  • 原理:连接池预先创建一定数量的数据库连接并管理它们,避免每次操作都创建和销毁连接,从而减少连接建立和关闭的开销。
  • 实现方式
    • 在 Java 中,使用像 HikariCP、Druid 等连接池库。以下是使用 HikariCP 的简单示例:
    import com.zaxxer.hikari.HikariConfig;
    import com.zaxxer.hikari.HikariDataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    public class ConnectionPoolExample {
        public static void main(String[] args) {
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database");
            config.setUsername("your_username");
            config.setPassword("your_password");
            config.setMaximumPoolSize(10); // 设置连接池最大连接数
    
            HikariDataSource dataSource = new HikariDataSource(config);
    
            try (Connection connection = dataSource.getConnection()) {
                // 执行 SQL 操作
                // 例如:
                // Statement stmt = connection.createStatement();
                // ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                dataSource.close();
            }
        }
    }
    
    • 在 Python 中,使用 SQLAlchemy 可以方便地实现连接池。以下是一个简单示例:
    from sqlalchemy import create_engine
    
    engine = create_engine('mysql+pymysql://your_username:your_password@localhost:3306/your_database', pool_size=10, max_overflow=20)
    connection = engine.connect()
    # 执行 SQL 操作,例如:
    # result = connection.execute("SELECT * FROM your_table")
    connection.close()
    
  • 代码解释
    • 在 Java 示例中,首先配置 HikariConfig 类,设置数据库连接信息和连接池最大连接数。然后创建 HikariDataSource 作为数据源,从该数据源获取连接进行 SQL 操作。最后在 finally 块中关闭数据源。
    • 在 Python 示例中,使用 create_engine 创建一个连接引擎,设置 pool_size 为 10,max_overflow 为 20,获取连接进行操作后关闭连接。连接池会管理连接的创建、复用和关闭。

减少对 MySQL 的访问

  • 策略:通过合并多个查询请求,避免频繁的小查询,提高整体性能。例如,使用批量插入或更新,而不是单个插入或更新操作。
  • 示例
    -- 批量插入示例
    INSERT INTO your_table (column1, column2) VALUES (value1, value2), (value3, value4), (value5, value6);
    
    -- 批量更新示例
    UPDATE your_table SET column1 = CASE 
        WHEN id = 1 THEN 'new_value1'
        WHEN id = 2 THEN 'new_value2'
        WHEN id = 3 THEN 'new_value3'
    END
    WHERE id IN (1, 2, 3);
    

避免对同一数据做重复检查

  • 原理:使用缓存存储已经检查过的数据结果,避免重复的数据库查询。
  • 实现方式
    • 在应用程序中使用内存缓存,如 Redis 或 Memcached。以下是使用 Redis 缓存的 Python 示例:
    import redis
    import json
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    def get_data_from_cache(key):
        data = r.get(key)
        if data:
            return json.loads(data)
        else:
            # 从数据库查询数据
            data = query_data_from_db()
            r.setex(key, 3600, json.dumps(data))  # 缓存数据一小时
            return data
    
    def query_data_from_db():
        # 模拟数据库查询操作
        return {'key': 'value'}
    

使用查询缓存

  • 原理:MySQL 本身有查询缓存功能,对于相同的查询语句,直接从缓存中获取结果,提高性能。但要注意其局限性,例如表更新后,相关查询缓存会失效。
  • 启用查询缓存:在 MySQL 配置文件中添加或修改以下配置:
    query_cache_type = 1;
    query_cache_size = 128M;
    

增加 CACHE 层

  • 原理:在应用和数据库之间增加缓存层,缓存经常访问的数据,如使用 Redis 或 Memcached。
  • 示例(使用 Redis)
    import redis
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    def get_data(key):
        data = r.get(key)
        if data:
            return data.decode('utf-8')
        else:
            # 从数据库获取数据
            data = fetch_data_from_db()
            r.setex(key, 3600, data)  # 缓存数据一小时
            return data
    
    def fetch_data_from_db():
        # 模拟数据库查询操作
        return "data from database"
    

负载均衡

  • 原理:将数据库请求分发到多个数据库服务器,以分散负载,提高系统整体性能和可用性。
  • 实现方式
    • 使用 MySQL 复制(主从复制),将读请求分发到从服务器。
    • 使用中间件,如 MySQL Proxy 或 HAProxy,将请求路由到不同服务器。

利用 MySQL 复制分流查询操作

  • 原理:通过 MySQL 的主从复制,主服务器负责写操作,从服务器负责读操作,实现读写分离,提高系统性能。
  • 配置主从复制
    1. 在主服务器上设置:
    -- 开启二进制日志
    log-bin = /var/log/mysql/mysql-bin.log
    server-id = 1
    
    1. 在从服务器上设置:
    server-id = 2
    
    1. 在从服务器上执行复制命令:
    CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file', MASTER_LOG_POS=recorded_log_position;
    START SLAVE;
    

采用分布式数据库架构

  • 原理:将数据分布在多个节点上,提高系统的可扩展性和性能。
  • 实现方式
    • 使用 MySQL Cluster 或开源的分布式数据库系统,如 TiDB 等。

其他优化措施

  • 优化 SQL 语句
    • 避免使用 SELECT *,只选择需要的列,减少数据传输量。
    • 合理使用索引,提高查询效率。
    • 避免在 WHERE 子句中使用函数或表达式,防止索引失效。
    • 优化表结构,适当进行反规范化。
  • 硬件优化
    • 增加内存,使用更快的磁盘(如 SSD),提升 I/O 性能。

小结 SQL 应用优化涉及多个方面,包括使用连接池、减少访问次数、使用缓存、增加 CACHE 层、负载均衡、利用复制和分布式架构等。不同的优化措施可以结合使用,根据具体的业务需求和系统环境,选择合适的优化策略,以达到提高性能、提高可用性和可扩展性的目的。同时,优化是一个持续的过程,需要根据系统性能指标和用户需求不断调整。

在这里插入图片描述


http://www.kler.cn/a/473526.html

相关文章:

  • api开发如何在代码中使用京东商品详情接口的参数?
  • IOS开发如何从入门进阶到高级
  • AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表
  • C# 实现 gRPC 进程间通讯:两台设备的数据交换之道
  • STM32——系统滴答定时器(SysTick寄存器详解)
  • Selenium 八大元素定位方法及场景扩展
  • MSE学习
  • 【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题
  • Google Chrome 去除更新 Windows
  • Unity 热更新基础知识
  • vue-整合校验validator demo
  • 79 Openssl3.0 RSA公钥加密数据
  • Fastapi + vue3 自动化测试平台(2)--日志中间件
  • WordPress Crypto插件前台任意用户登录漏洞复现(CVE-2024-9989)(附脚本)
  • 学习第六十二行
  • <论文>什么是胶囊神经网络?
  • 使用java springboot 使用 Redis 作为限流工具
  • 使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中
  • MySql---进阶篇(十一)----游标,条件处理程序,存储函数
  • Bash语言的计算机基础
  • 【优选算法】Binary-Blade:二分查找的算法刃(下)
  • 一款FPGA芯片开发的核心板(EP4CE6核心板)
  • WebRTC 的优缺点详细解析
  • 怎麼在iPhone iOS(Wi-Fi/蜂窩數據)上查找IP地址?
  • vue js实现时钟以及刻度效果
  • HTML5 波动动画(Pulse Animation)详解