Mysql
診斷特定伺服器上的慢速腳本執行
我使用遠端數據中心中的非託管伺服器來託管基於 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 對順序非常挑剔,因此您可能會被卡住。