如何解决MySQL 数据库性能恶化
我正在处理一个股票项目,我正在从 API(ohlc 分钟蜡烛图)中提取股票数据并将其存储到 MySql 服务器中,以便稍后运行分析。我的问题是,随着我将越来越多的数据存储到数据库中(写入需要 15 到 20 秒,读取需要 7 到 10 秒),读写速度迅速下降。
我想存储可以轻松访问且易于查询的分钟烛台股票数据。我知道,对于过去十年中我一直希望提取数据的大约 30000 只股票,这将为我提供数十亿行数据。我对性能和规模有足够的了解,将所有这些条目放入一个表中是不可取的。因此,我所做的是为每只股票创建了一个单独的表,其中只保存与该特定股票对应的行。所以股票 A 可能有 ~500k 行,股票 B 可能有 ~500k 行。我使用特定蜡烛图的时间戳作为每个表的主键,因为它是唯一的。
当我开始提取数据并将其存储在我的数据库中时,它运行得非常好。我将能够一次写入数千行而几乎没有问题(对于这种大小的写入,不到半秒)。我可以创建一个表,比如 AAPL,它有近 100 万个条目,没有问题。
我对可能导致我的性能严重下降的原因进行了一些研究:
网络问题:我正在执行此任务的程序已经运行了几天,即使进行了各种调整后,性能仍然保持不变。我网络中的所有其他应用程序都运行顺利,所以我认为网络性能不太可能。
机器问题:我的意思是 CPU/内存/磁盘不够。过去几个小时我一直在监视它,它们具有以下特征: (这是在 Windows 10 32 位 fyi 上运行的。我不知道最强大的机器)
CPU:始终低于 10%,但偶尔会达到 ~30% 内存:保持在 ~60% 左右 磁盘:保持在 5% 到 20% 之间
虽然这台机器肯定不是顶级硬件,但我倾向于认为机器功率是这里的主要问题(尽管我确信更强大的硬件会有所帮助),因为性能已经下降但没有从一开始就很糟糕。
配置问题:我发现了一些关于各种配置字段(在 my.ini 中)的建议来调整性能问题。我唯一改变的是key_buffer_size。它最初设置为 8M,我将其更改为 32M,性能几乎没有变化(是的,我在配置更改后重新启动了服务器)。我这样做是因为它暗示如果键的映射太大,它将存储在磁盘上,从而大大降低性能。我猜因为我的桌子数量现在大约是 10k,所以这可能就是问题所在。我不知道我是否应该把它放大,因为我不确定这是否是问题所在。
如果有人知道应该更改配置字段以支持我正在尝试做的事情,请告诉我。配置发布在这里,并删除了文件中的所有注释,以便于阅读:
*********** 配置开始 **************** [客户]
端口=3306
[mysql] 无声
[mysqld]
端口=3306
datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
日志输出=文件
general-log=0
general_log_file="MYPC.log"
慢查询日志=1
slow_query_log_file="MYPC-slow.log"
long_query_time=10
log-error="MYPC.err"
服务器 ID=1
lower_case_table_names=1
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
max_connections=151
table_open_cache=2000
tmp_table_size=61M
thread_cache_size=10
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=112M
key_buffer_size=64M
read_buffer_size=64K
read_rnd_buffer_size=256K
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=48M
innodb_thread_concurrency=8
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4161
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000
********** 配置结束 ****************
解决方法
(在等待 Wilson 要求的数据时,这里有一些提示。)
key_buffer_size
仅由 MyISAM 使用;我希望你不要使用它。
innodb_buffer_pool_size
需要超过 8M。什么版本的 MySQL?
只有 32 位机器?这意味着您的 RAM 不超过 4GB。对于 4GB 的 RAM,将 buffer_pool 设置为 2G;如果这导致交换,降低它。
如果慢日志中没有显示任何内容,请将 long_query_time=10
降低到 3。
table_open_cache=2000
可能是在浪费空间;降低到 500,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。