【发布时间】:2018-08-12 04:34:14
【问题描述】:
我一直在使用单独的服务器来配置 mariadb,但查询仍然需要很长时间才能返回,而且大部分都没有返回。
Mariadb 版本:10.1.31-1 服务器有 50GB 内存和 2200 Ghz * 10 核 Centos7 作为 OP
目标数据库当前有非常大的 innodb 表并且没有很好的索引。没有任何其他表类型,只有 innodb。
目前我正在做一些嵌套的选择查询并将结果保存到另一个空的克隆数据库中插入或替换到。
举个例子:
REPLACE INTO db1.table1
SELECT * FROM db0.table1 WHERE ART_ID IN (
SELECT ART_ID FROM db0.table2 WHERE BRA_ID IN (
SELECT BRA_ID FROM db0.table3 WHERE BRAND IN (
SELECT BRAND FROM db0.table4 WHERE ID IN (... bunch of comma seperated ids)
)
)
);
唯一的连接来自本地和/或只有一个远程连接。 服务器的唯一任务是将大量数据过滤到另一个数据库,没有网络服务器等。
我把 /etc/my.cnf 文件放在下面。我对这个文件做了很多测试,所以你可能会看到一些无用的添加。
问题是:cnf文件中是否有遗漏配置;是否有任何其他配置提示等可以在合理的时间内运行这些查询。
它工作得更好,但是在我更改配置或/并更新服务器之后,一切都变得慢了很多。 (是的,我在更新数据库版本后也更新了表格)
# The MySQL server
[mysqld]
performance_schema=0
bind-address = 0.0.0.0
max_connections = 32
socket = /var/lib/mysql/mysql.sock
skip-external-locking
max_allowed_packet = 1024M
connect_timeout=300
wait_timeout=1200
interactive_timeout=300
key_buffer_size = 2G
bulk_insert_buffer_size=256M
sort_buffer_size = 32M
#read_buffer_size = 8M
#read_rnd_buffer_size = 32M
myisam_sort_buffer_size = 32M
join_buffer_size=32M
#max_heap_table_size= 8G
tmp_table_size=8G
concurrent_insert=2
#external-locking=FALSE
#open_files_limit=50000
default-storage-engine=innodb
innodb_file_per_table=1
#lower_case_table_names=1
# Try number of CPU's*2 for thread_concurrency
innodb_write_io_threads=10
innodb_read_io_threads=20
#innodb_buffer_pool_instances=8
#thread_stack = 1M
#thread_cache_size = -1
innodb_buffer_pool_size = 16G
#query_cache_limit = 1073741824
#query_cache_size = 1073741824
#query_cache_type = 1
query_cache_size=0
query_cache_type=0
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_fast_shutdown=0
#innodb_log_file_size = 1G
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 0
innodb_lock_wait_timeout = 1073741823
innodb_thread_concurrency=0
innodb_commit_concurrency=0
innodb_flush_method=O_DSYNC
innodb_log_compressed_pages = 0
#innodb_flush_neighbors = 0
#innodb_adaptive_hash_index_partitions = 8
log-bin=mysql-bin
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 384M
sort_buffer = 384M
read_buffer = 256M
write_buffer = 256M
[myisamchk]
key_buffer = 384M
sort_buffer = 384M
read_buffer = 256M
write_buffer = 256M
[mysqlhotcopy]
interactive-timeout
我使用了 percona 向导并合并了建议。 当前的 my.cnf 在下面。
我昨天晚上(2018-03-05 22:41:30 UTC)运行了 php 应用程序,但 mysql 仍然无法返回任何结果。
应用程序仅添加限制 10000 和偏移量(我不想从头开始,我目前正在跟踪最后一个偏移量并从该点开始。)
目前我正计划删除并重新安装 mariadb :( (会是情绪反应)
# Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5-20120208
[mysql]
# CLIENT #
port = 9999
socket = /var/lib/mysql/mysql.sock
[mysqld]
# GENERAL #
port = 9999
user = mysql
default-storage-engine = InnoDB
socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid
# MyISAM # - there is no myisam table
key-buffer-size = 32M
myisam-recover-options = FORCE,BACKUP
# SAFETY #
max-allowed-packet = 16M
max-connect-errors = 1000000
skip-name-resolve
# DATA STORAGE #
datadir = /var/lib/mysql/
# BINARY LOGGING #
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14
sync-binlog = 1
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 0
max-connections = 30
#thread-cache-size = 16
open-files-limit = 65535
table-definition-cache = 1024
table-open-cache = 2048
# INNODB #
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 5G
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
innodb-buffer-pool-size = 42G
innodb-buffer-pool-instances = 42
thread_cache_size=100
innodb_lru_scan_depth=100
innodb_purge_threads=4
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_thread_concurrency=0
max_seeks_for_key=32
max_write_lock_count=16
thread_concurrency=35
innodb_fast_shutdown=0
innodb_file_per_table=1
default-storage-engine=innodb
concurrent_insert=2
join_buffer_size=32M
tmp_table_size=8G
read_buffer_size = 8M
# LOGGING #
log-error = /var/lib/mysql/mysql-error.log
log-queries-not-using-indexes = 0
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
【问题讨论】:
-
我也是用户 tools.percona.com/wizard 当我使用该配置进行测试时,结果更快,但还不够
-
显示全局状态 - pastebin.com/8tQe7eeZ,显示全局变量 - pastebin.com/85VfeRjV,显示引擎 INNODB 状态 - pastebin.com/wB5SMbHh,除了 mysql 之外没有任何其他应用程序。我刚刚创建了一个应用程序来按块收集结果,所以有一个额外的 php 应用程序
-
休息在这里pastebin.com/esxDWPu3@WilsonHauck
-
请发布您完整的慢查询日志。对于上面的查询,将第一行替换为 EXPLAIN EXTENDED SELECT 发布完整的输出。什么都不会被替换,只是寻找 TABLES USED,行数......
-
SHOW-GLOBAL-STATUS: pastebin.com/AdxPRfHj,所有查询都写在慢日志中,一般是因为时间pastebin.com/PvgyPnLY,这是解释pastebin.com/zC8ja216
标签: mysql optimization mariadb centos7 configure