Mysql

診斷特定伺服器上的慢速腳本執行

  • August 3, 2020

我使用遠端數據中心中的非託管伺服器來託管基於 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 對順序非常挑剔,因此您可能會被卡住。

引用自:https://dba.stackexchange.com/questions/271044