我使用远程数据中心中的非托管服务器来托管基于 Web 的应用程序。当我们运行 SQL 脚本来创建和填充应用程序数据库时,整个过程非常缓慢。在我动力不足的本地 PC 中运行的一组脚本需要5 秒,而在远程服务器上可能需要长达20 分钟。
当我检查正在运行的进程时,我可以看到它没有卡在任何特定的语句中,只是每个都需要几秒钟,特别是ALTER TABLE
语句:
ALTER TABLE foo_bar
ADD CONSTRAINT FK_foo_bar_foo_id
FOREIGN KEY (foo_id)
REFERENCES foo (id)
这是一个全新的应用程序,因此大多数表格都是空的或最多只有几百行。INSERT INTO
但是在声明之前就已经很慢了。所有表都是 InnoDB。
如果这很重要,我会通过命令行 PHP 运行脚本。我知道没有防病毒软件。MySQL/8.0 与 Windows MySQL Installer 一起安装,并使用以下配置作为服务运行:
[client]
port=3306
[mysql]
no-beep
[mysqld]
port=3306
datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
default_authentication_plugin=mysql_native_password
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="FOO.log"
slow-query-log=1
slow_query_log_file="FOO-slow.log"
long_query_time=10
log-error="FOO.err"
server-id=1
lower_case_table_names=1
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
max_connections=151
table_open_cache=2000
tmp_table_size=16M
thread_cache_size=10
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=8M
read_buffer_size=0
read_rnd_buffer_size=0
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=17
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
loose_mysqlx_port=33060
character-set-server = utf8
collation-server = utf8_unicode_ci
log-bin = OFF
skip-bin-log
我可以从哪里开始看这个?我可以尝试哪些诊断?
每个服务器使用哪个版本?
ALTER TABLE
在 8.0 中明显变慢了。它可能与回滚 DDL 的能力有关。依赖大量 DDL 从来都不是明智之举,但这会使情况变得更糟。
如果这
ALTER
是对一个全新的表执行此操作,那么将 包含CONSTRAINT
在表定义中可能会更好。当然,如果ALTER
是由 mysqldump` 生成的,这是不实用的。此外,FK 对顺序非常挑剔,因此您可能会被卡住。配置中的文件名不应用引号括起来。从未见过有人使用 read_buffer_size 和 read_rnd_buffer_size=0 运行。通过使用 # 和空格字符引导行来禁用这两行,以允许默认值为您工作。