MySQL 总是将简单的临时/内存表写入磁盘(tmp_table_size 和 max_heap_table_size 均设置为 8GB)

标签 mysql

我正在努力解决这个问题,只是想不通为什么会这样。

CREATE TABLE sitecache._test ENGINE=MEMORY SELECT * FROM website.gallery_likes WHERE 1=0;

每次执行此查询时,Created tmp disk tables 服务器变量立即增加 5CREATE TEMPORARY TABLE ... 以及创建具有结构定义的表而不是从另一个表复制结构时也会发生同样的事情。

website.gallery_likes 的结构:

CREATE TABLE gallery_likes (
  photoid mediumint(8) unsigned NOT NULL,
  userid int(10) unsigned NOT NULL,
  timestamp int(10) unsigned NOT NULL,
  KEY photoid (photoid,userid)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

如您所见,没有 TEXT 和 BLOB 字段,这是一个相当简单的表。如果我随后将大量数据转储到该临时/内存表中,则需要几分钟才能完成,我可以看到 mysqld 如何将大量数据写入 C:\Windows\Temp 目录中的临时文件。

tmp_table_sizema​​x_heap_table_size 都设置为 8GB(并通过 SHOW VARIABLES 确认)。

Windows Server 2012 R2 x64 上的 MySQL 5.6.17 x64,内存为 64GB。

配置:

[client]
no-beep
port=3306

[mysql]
default-character-set=latin1

[mysqld_safe]
open-files-limit=16384

[mysqld]
log-bin="D:/MySQL Blackhole/master_replication.log"
sync_binlog=0
binlog-do-db=...
binlog-ignore-db=...
...edited...
binlog-format=STATEMENT
expire_logs_days=1
server-id=1
ft_min_word_len=3
innodb_ft_min_token_size=3
port=3306
datadir="D:/MySQL/data/"
character-set-server=latin1
default-storage-engine=MYISAM
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
log-output=NONE
general-log=0
general_log_file="MYSQL_SERVER.log"
slow-query-log=0
slow_query_log_file="MYSQL_SERVER-slow.log"
long_query_time=10
log-error="MYSQL_SERVER.err"
max_connections=1024
query_cache_size=0
table_open_cache=4096
tmp_table_size=8G
max_heap_table_size=8G
thread_cache_size=64
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=256M
key_buffer_size=8192M
read_buffer_size=2M
read_rnd_buffer_size=128M
sort_buffer_size=8M
innodb_flush_log_at_trx_commit=0
innodb_flush_log_at_timeout=1
innodb_log_buffer_size=32M
innodb_buffer_pool_size=32G
innodb_log_file_size=8G
innodb_thread_concurrency=0
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=0
innodb_open_files=4096
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=strict_crc32
innodb_adaptive_hash_index=ON
back_log=80
flush_time=0
join_buffer_size=8M
max_allowed_packet=16M
max_connect_errors=10
open_files_limit=16384
query_cache_type=0
table_definition_cache=2500

(query_cache_size=0default-storage-engine=MYISAM 故意)

我现在已经多次阅读文档,但我只是看不出发生这种情况的任何关联。该表相当简单,没有超过 512 字节长的列。

最佳答案

好的,以防万一有人遇到类似问题,Google 会将他们引导至此处:
我没有完全弄清楚为什么,但有点弄清楚是什么原因造成的,phpMyAdmin 是罪魁祸首。

直接在 mysql 命令行中发出相同的命令不会导致将临时表写入磁盘。
现在,我的开发机器上也有 phpMyAdmin,这不是问题。但我在 Apache 中将 PHP 作为模块运行,而在生产服务器上,它是 IIS,PHP 作为 FastCGI 运行。所以一定是某些配置或限制导致了这种情况,不确定。

关于MySQL 总是将简单的临时/内存表写入磁盘(tmp_table_size 和 max_heap_table_size 均设置为 8GB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28228669/

相关文章:

php - 使用 PHP 7 连接数据库错误

Mysql Error 1064 ("You have an error in your SQL syntax") 由 SQL 注释触发

php - 转置返回的 JSON 对象(PHP、mySQL)

mysql - 如何在 SQL 中获取近似行

PHP 插入 MySQL 数组,其中一个字段是在第一个 SQL 语句中创建的所有数据库字段

mysql - 如何让 MySQL 查询更加高效?子查询/左连接

python - 尝试通过 python 插入时出现 SQL 语法错误

php - 使用PHP为MySQL中的多个数据生成图形

mysql - 我是否将 WHERE 条件放在 WHERE 或 Join 子句中,与连接无关,这会有所不同吗?

php - 使用 MySQLi 从 PHP 调用 MySQL 存储函数时出现 fatal error