mysql 来自具有数百万行的表的多个内部连接

waxmsbnn  于 2023-04-04  发布在  Mysql
关注(0)|答案(2)|浏览(142)

我有一个mysql数据库,其中有多个表“InnoDB”,其中有数百万行。让我们说,大多数与表的交互都是简单的选择/插入语句。但我必须为统计目的制作一些内部关节。
我有两个服务器与主/从复制.主是只写和读从分离的查询手动不使用负载均衡器像ProxySQL...它的工作很好的简单查询.
服务器规格:

CPU : Intel Xeon E5-1630v3 - 4c/8t - 3.7 GHz/3.8 GHz 
RAM : 64 GB ECC 2133 MHz
Latency between the two servers is 1ms (measured)

问题是当我运行统计模块时,我得到了99%的CPU使用率,查询需要很多时间。例如:1 INNER JOIN需要2或3秒(带索引),但当我启动很多时,它可能需要长达90秒。
很明显,我必须添加更多的服务器,并围绕负载均衡器构建一个体系结构。但在我深入研究之前,任何人都可以为我的情况建议一个工作解决方案。
先谢谢你了。

iezvtpos

iezvtpos1#

下面是一些提高你的表现的建议:

  • 检查查询执行计划--确定查询中的任何潜在瓶颈
  • 确保JOIN中使用的列有适当的索引
  • 优化数据库配置--检查您的配置文件(my.cnf),并根据硬件配置和工作负载对其进行调整(参数如“innodb_buffer_pool_size”、“innodb_log_file_size”、“innodb_flush_log_at_trx_commit”、“innodb_thread_concurrency”等)
  • 使用缓存--缓存层使用Redis或Memcached等工具来缓存频繁访问的数据并减少数据库的负载
  • 分区--考虑根据日期对具有数百万行的大型表进行分区|地理位置
  • 优化模式--规范化表以减少冗余+为列使用适当的数据类型
  • 升级您的硬件--更多的CPU内核--更快的磁盘I/O --更多的RAM

正如您已经确定的,使用负载均衡器进行水平扩展可能是处理不断增加的负载的最佳长期解决方案

eoxn13cs

eoxn13cs2#

谢谢你的回复@lemonina
我想知道为什么我的问题有一个-1...
我在重新安装之前运行了一个Benchmark,全部使用sysbench:

sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=sysbench --mysql-password='sysbench' --mysql-db=sysbench --db-driver=mysql --tables=6 --table-size=30000000 prepare
sysbench --db-driver=mysql --mysql-user=sysbench --mysql_password=sysbench --mysql-db=sysbench --mysql-host=127.0.0.1 --mysql-port=3306 --tables=6 --table-size=30000000 --threads=16 --time=300 --events=0 --report-interval=1 /usr/share/sysbench/oltp_read_write.lua run

结果如下:

SQL statistics:
    queries performed:
        read:                            1039458
        write:                           296988
        other:                           148494
        total:                           1484940
    transactions:                        74247  (247.46 per sec.)
    queries:                             1484940 (4949.13 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0391s
    total number of events:              74247

Latency (ms):
         min:                                    5.08
         avg:                                   64.65
         max:                                  805.41
         95th percentile:                      170.48
         sum:                              4800305.37

Threads fairness:
    events (avg/stddev):           4640.4375/18.04
    execution time (avg/stddev):   300.0191/0.00

本测试没有特定配置。
根据你的建议做了一些修改:

  • innodb_buffer_pool_size = 48G|基于here,建议使用60%到80%的RAM
  • innodb_log_file_size = 10G|从Percona
  • innodb_thread_concurrency = 0|从Link开始
  • innodb_flush_log_at_trx_commit=1|关于Link
  • 同步二进制日志=1|关于Link
  • innodb_file_per_table(NO)|从Link
  • 对于缓存,我认为它不会工作,因为每秒都有新数据
  • SET GLOBAL innodb_redo_log_capacity = 8589934592;对于复制副本
  • 使用ProxySQL进行水平扩展将是一个很好的主意。我已经测试过了,但是我放弃了这个解决方案,因为查询的调度速度很慢。我发现了一个解决方案,所以我想我会在不久的将来测试这个。
  • 我也读到了关于在服务器之间划分数据库的内容,我没有测试它,但是我必须弄清楚哪些表可以放在同一个服务器上作为INNER JOINT。

以下是我的新配置:

innodb_buffer_pool_size = 48G
innodb_log_file_size = 10G
innodb_thread_concurrency = 0
innodb_flush_log_at_trx_commit=1
sync_binlog=1

max_connections = 10000
wait_timeout = 300
interactive_timeout = 10
connect_timeout = 60
binlog_expire_logs_seconds = 86400

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
slow_query_log = 1

同样的测试结果:

SQL statistics:
    queries performed:
        read:                            7376012
        write:                           2107432
        other:                           1053716
        total:                           10537160
    transactions:                        526858 (1756.07 per sec.)
    queries:                             10537160 (35121.32 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0205s
    total number of events:              526858

Latency (ms):
         min:                                    2.76
         avg:                                    9.11
         max:                                  116.71
         95th percentile:                       14.46
         sum:                              4799015.34

Threads fairness:
    events (avg/stddev):           32928.6250/51.95
    execution time (avg/stddev):   299.9385/0.00

我不确定重新安装100 Go数据库是否会影响所获得的性能或配置。
你觉得呢?

相关问题