MySQL tmp_table_size 用于小型数据库
MySQL tmp_table_size for a small database
我在 Ubuntu 18.04 上有 MySQL 5.7.23。这是一个具有 2 个 vCore 和 8 GiB RAM 的 VPS。该服务器托管两个 WordPress 网站。每个网站都有一个大小为 7.5 MB 的数据库。所以总共有 15 MB 的数据库。
我正在尝试使用 mysqltuner 优化数据库。它每次都向我推荐同样的东西:
Variables to adjust:
tmp_table_size (> 64M)
max_heap_table_size (> 64M)
我从16M开始,后来建议我增加到32M,现在又建议我增加到64M或更多。但为什么?我所有数据库的总大小约为 15M。
我有足够的内存,可用内存大约为 6.5 GiB,所以我可以为 MySQL 使用更多内存。
来自 mysqltuner 的完整日志是
root@web:~# perl mysqltuner.pl
>> MySQLTuner 1.7.10 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[--] Skipped version check for MySQLTuner script
[OK] Logged in using credentials from Debian maintenance account.
[OK] Currently running supported MySQL version 5.7.23-0ubuntu0.18.04.1
[OK] Operating on 64-bit architecture
-------- Log file Recommendations ---------------------------------------------- --------------------
[--] Log file: /var/log/mysql/error.log(0B)
[OK] Log file /var/log/mysql/error.log exists
[OK] Log file /var/log/mysql/error.log is readable.
[!!] Log file /var/log/mysql/error.log is empty
[OK] Log file /var/log/mysql/error.log is smaller than 32 Mb
[OK] /var/log/mysql/error.log doesn't contain any warning.
[OK] /var/log/mysql/error.log doesn't contain any error.
[--] 0 start(s) detected in /var/log/mysql/error.log
[--] 0 shutdown(s) detected in /var/log/mysql/error.log
-------- Storage Engine Statistics --------------------------------------------- --------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +My ISAM +PERFORMANCE_SCHEMA
[--] Data in InnoDB tables: 14.2M (Tables: 45)
[OK] Total fragmented tables: 0
-------- Security Recommendations ---------------------------------------------- --------------------
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[--] Bug #80860 MySQL 5.7: Avoid testing password when validate_password is acti vated
-------- CVE Security Recommendations ------------------------------------------ --------------------
[--] Skipped due to --cvefile option undefined
-------- Performance Metrics --------------------------------------------------- --------------------
[--] Up for: 1d 2h 43m 42s (84K q [0.879 qps], 1K conn, TX: 441M, RX: 12M)
[--] Reads / Writes: 98% / 2%
[--] Binary logging is disabled
[--] Physical Memory : 7.8G
[--] Max MySQL memory : 384.4M
[--] Other process memory: 252.8M
[--] Total buffers: 224.0M global + 1.1M per thread (151 max threads)
[--] P_S Max memory usage: 72B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 228.3M (2.86% of installed RAM)
[OK] Maximum possible memory usage: 384.4M (4.82% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/84K)
[OK] Highest usage of available connections: 2% (4/151)
[OK] Aborted connections: 0.00% (0/1561)
[OK] Query cache is disabled by default due to mutex contention on multiprocesso r machines.
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 12K sorts)
[OK] No joins without indexes
[!!] Temporary tables created on disk: 44% (3K on disk / 7K total)
[OK] Thread cache hit rate: 99% (4 created / 1K connections)
[OK] Table cache hit rate: 77% (1K open / 1K opened)
[OK] Open file limit used: 1% (56/5K)
[OK] Table locks acquired immediately: 100% (202 immediate / 202 locks)
-------- Performance schema ---------------------------------------------------- --------------------
[--] Memory used by P_S: 72B
[--] Sys schema is installed.
-------- ThreadPool Metrics ---------------------------------------------------- --------------------
[--] ThreadPool stat is disabled.
-------- MyISAM Metrics -------------------------------------------------------- --------------------
[!!] Key buffer used: 18.3% (3M used / 16M cache)
[OK] Key buffer size / total MyISAM indexes: 16.0M/43.0K
[OK] Read Key buffer hit rate: 96.3% (190 cached / 7 reads)
-------- InnoDB Metrics -------------------------------------------------------- --------------------
[--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 0
[OK] InnoDB File per table is activated
[OK] InnoDB buffer pool / data size: 128.0M/14.2M
[OK] Ratio InnoDB log file size / InnoDB Buffer pool size: 16.0M * 2/128.0M shou ld be equal 25%
[OK] InnoDB buffer pool instances: 1
[--] Number of InnoDB Buffer Pool Chunk : 1 for 1 Buffer Pool Instance(s)
[OK] Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size & Innodb _buffer_pool_instances
[OK] InnoDB Read buffer efficiency: 99.96% (2124360 hits/ 2125302 total)
[!!] InnoDB Write Log efficiency: 83.91% (9286 hits/ 11067 total)
[OK] InnoDB log waits: 0.00% (0 waits / 1781 writes)
-------- AriaDB Metrics -------------------------------------------------------- --------------------
[--] AriaDB is disabled.
-------- TokuDB Metrics -------------------------------------------------------- --------------------
[--] TokuDB is disabled.
-------- XtraDB Metrics -------------------------------------------------------- --------------------
[--] XtraDB is disabled.
-------- RocksDB Metrics ------------------------------------------------------- --------------------
[--] RocksDB is disabled.
-------- Spider Metrics -------------------------------------------------------- --------------------
[--] Spider is disabled.
-------- Connect Metrics ------------------------------------------------------- --------------------
[--] Connect is disabled.
-------- Galera Metrics -------------------------------------------------------- --------------------
[--] Galera is disabled.
-------- Replication Metrics --------------------------------------------------- --------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: ROW
[--] XA support enabled: ON
[--] Semi synchronous replication Master: Not Activated
[--] Semi synchronous replication Slave: Not Activated
[--] This is a standalone server
-------- Recommendations ------------------------------------------------------- --------------------
General recommendations:
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries which have no LIMIT clause
Variables to adjust:
tmp_table_size (> 64M)
max_heap_table_size (> 64M)
您应该对 mysqltuner 的建议持保留态度。它的建议不是在您对数据库或查询有任何了解的情况下提出的,有时它们只是基于不完整信息的猜测。
增加 tmp_table_size 的建议可能基于读取表明在磁盘上创建了一些临时 table 的状态值。
mysql> show global status like 'created%tables';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 35 |
| Created_tmp_tables | 274 |
+-------------------------+-------+
"Aha!" 说 mysqltuner,“13% 的临时 tables 在磁盘上。如果我们允许更大的临时 tables 留在 RAM 中,它们可能会留在 RAM 中. 加倍 tmp_table_size!"
但是一些临时 table 是 总是 在磁盘上创建的。
https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html 说:
Some query conditions prevent the use of an in-memory temporary table,
in which case the server uses an on-disk table instead:
Presence of a BLOB or TEXT column in the table. This includes
user-defined variables having a string value because they are treated
as BLOB or TEXT columns, depending on whether their value is a binary
or nonbinary string, respectively.
Presence of any string column with a maximum length larger than 512
(bytes for binary strings, characters for nonbinary strings) in the
SELECT list, if UNION or UNION ALL is used.
The SHOW COLUMNS and DESCRIBE statements use BLOB as the type for some
columns, thus the temporary table used for the results is an on-disk
table.
mysqltuner 如何区分因为太大而进入磁盘的 temp tables 与由于上述情况之一而进入磁盘的 temp tables 之间的区别?
无法区分。它必须读取您的查询日志并分析每个查询,但它不会这样做。它只知道磁盘上有多少临时table,不知道为什么。
Mysqltuner 仅假设临时 table 存储在磁盘上,因为它大于 tmp_table_size,并且它假设增加 tmp_table_size 会有一些好处。
我在 Ubuntu 18.04 上有 MySQL 5.7.23。这是一个具有 2 个 vCore 和 8 GiB RAM 的 VPS。该服务器托管两个 WordPress 网站。每个网站都有一个大小为 7.5 MB 的数据库。所以总共有 15 MB 的数据库。
我正在尝试使用 mysqltuner 优化数据库。它每次都向我推荐同样的东西:
Variables to adjust:
tmp_table_size (> 64M)
max_heap_table_size (> 64M)
我从16M开始,后来建议我增加到32M,现在又建议我增加到64M或更多。但为什么?我所有数据库的总大小约为 15M。
我有足够的内存,可用内存大约为 6.5 GiB,所以我可以为 MySQL 使用更多内存。
来自 mysqltuner 的完整日志是
root@web:~# perl mysqltuner.pl
>> MySQLTuner 1.7.10 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[--] Skipped version check for MySQLTuner script
[OK] Logged in using credentials from Debian maintenance account.
[OK] Currently running supported MySQL version 5.7.23-0ubuntu0.18.04.1
[OK] Operating on 64-bit architecture
-------- Log file Recommendations ---------------------------------------------- --------------------
[--] Log file: /var/log/mysql/error.log(0B)
[OK] Log file /var/log/mysql/error.log exists
[OK] Log file /var/log/mysql/error.log is readable.
[!!] Log file /var/log/mysql/error.log is empty
[OK] Log file /var/log/mysql/error.log is smaller than 32 Mb
[OK] /var/log/mysql/error.log doesn't contain any warning.
[OK] /var/log/mysql/error.log doesn't contain any error.
[--] 0 start(s) detected in /var/log/mysql/error.log
[--] 0 shutdown(s) detected in /var/log/mysql/error.log
-------- Storage Engine Statistics --------------------------------------------- --------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +My ISAM +PERFORMANCE_SCHEMA
[--] Data in InnoDB tables: 14.2M (Tables: 45)
[OK] Total fragmented tables: 0
-------- Security Recommendations ---------------------------------------------- --------------------
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[--] Bug #80860 MySQL 5.7: Avoid testing password when validate_password is acti vated
-------- CVE Security Recommendations ------------------------------------------ --------------------
[--] Skipped due to --cvefile option undefined
-------- Performance Metrics --------------------------------------------------- --------------------
[--] Up for: 1d 2h 43m 42s (84K q [0.879 qps], 1K conn, TX: 441M, RX: 12M)
[--] Reads / Writes: 98% / 2%
[--] Binary logging is disabled
[--] Physical Memory : 7.8G
[--] Max MySQL memory : 384.4M
[--] Other process memory: 252.8M
[--] Total buffers: 224.0M global + 1.1M per thread (151 max threads)
[--] P_S Max memory usage: 72B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 228.3M (2.86% of installed RAM)
[OK] Maximum possible memory usage: 384.4M (4.82% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/84K)
[OK] Highest usage of available connections: 2% (4/151)
[OK] Aborted connections: 0.00% (0/1561)
[OK] Query cache is disabled by default due to mutex contention on multiprocesso r machines.
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 12K sorts)
[OK] No joins without indexes
[!!] Temporary tables created on disk: 44% (3K on disk / 7K total)
[OK] Thread cache hit rate: 99% (4 created / 1K connections)
[OK] Table cache hit rate: 77% (1K open / 1K opened)
[OK] Open file limit used: 1% (56/5K)
[OK] Table locks acquired immediately: 100% (202 immediate / 202 locks)
-------- Performance schema ---------------------------------------------------- --------------------
[--] Memory used by P_S: 72B
[--] Sys schema is installed.
-------- ThreadPool Metrics ---------------------------------------------------- --------------------
[--] ThreadPool stat is disabled.
-------- MyISAM Metrics -------------------------------------------------------- --------------------
[!!] Key buffer used: 18.3% (3M used / 16M cache)
[OK] Key buffer size / total MyISAM indexes: 16.0M/43.0K
[OK] Read Key buffer hit rate: 96.3% (190 cached / 7 reads)
-------- InnoDB Metrics -------------------------------------------------------- --------------------
[--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 0
[OK] InnoDB File per table is activated
[OK] InnoDB buffer pool / data size: 128.0M/14.2M
[OK] Ratio InnoDB log file size / InnoDB Buffer pool size: 16.0M * 2/128.0M shou ld be equal 25%
[OK] InnoDB buffer pool instances: 1
[--] Number of InnoDB Buffer Pool Chunk : 1 for 1 Buffer Pool Instance(s)
[OK] Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size & Innodb _buffer_pool_instances
[OK] InnoDB Read buffer efficiency: 99.96% (2124360 hits/ 2125302 total)
[!!] InnoDB Write Log efficiency: 83.91% (9286 hits/ 11067 total)
[OK] InnoDB log waits: 0.00% (0 waits / 1781 writes)
-------- AriaDB Metrics -------------------------------------------------------- --------------------
[--] AriaDB is disabled.
-------- TokuDB Metrics -------------------------------------------------------- --------------------
[--] TokuDB is disabled.
-------- XtraDB Metrics -------------------------------------------------------- --------------------
[--] XtraDB is disabled.
-------- RocksDB Metrics ------------------------------------------------------- --------------------
[--] RocksDB is disabled.
-------- Spider Metrics -------------------------------------------------------- --------------------
[--] Spider is disabled.
-------- Connect Metrics ------------------------------------------------------- --------------------
[--] Connect is disabled.
-------- Galera Metrics -------------------------------------------------------- --------------------
[--] Galera is disabled.
-------- Replication Metrics --------------------------------------------------- --------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: ROW
[--] XA support enabled: ON
[--] Semi synchronous replication Master: Not Activated
[--] Semi synchronous replication Slave: Not Activated
[--] This is a standalone server
-------- Recommendations ------------------------------------------------------- --------------------
General recommendations:
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries which have no LIMIT clause
Variables to adjust:
tmp_table_size (> 64M)
max_heap_table_size (> 64M)
您应该对 mysqltuner 的建议持保留态度。它的建议不是在您对数据库或查询有任何了解的情况下提出的,有时它们只是基于不完整信息的猜测。
增加 tmp_table_size 的建议可能基于读取表明在磁盘上创建了一些临时 table 的状态值。
mysql> show global status like 'created%tables';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 35 |
| Created_tmp_tables | 274 |
+-------------------------+-------+
"Aha!" 说 mysqltuner,“13% 的临时 tables 在磁盘上。如果我们允许更大的临时 tables 留在 RAM 中,它们可能会留在 RAM 中. 加倍 tmp_table_size!"
但是一些临时 table 是 总是 在磁盘上创建的。
https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html 说:
Some query conditions prevent the use of an in-memory temporary table, in which case the server uses an on-disk table instead:
Presence of a BLOB or TEXT column in the table. This includes user-defined variables having a string value because they are treated as BLOB or TEXT columns, depending on whether their value is a binary or nonbinary string, respectively.
Presence of any string column with a maximum length larger than 512 (bytes for binary strings, characters for nonbinary strings) in the SELECT list, if UNION or UNION ALL is used.
The SHOW COLUMNS and DESCRIBE statements use BLOB as the type for some columns, thus the temporary table used for the results is an on-disk table.
mysqltuner 如何区分因为太大而进入磁盘的 temp tables 与由于上述情况之一而进入磁盘的 temp tables 之间的区别?
无法区分。它必须读取您的查询日志并分析每个查询,但它不会这样做。它只知道磁盘上有多少临时table,不知道为什么。
Mysqltuner 仅假设临时 table 存储在磁盘上,因为它大于 tmp_table_size,并且它假设增加 tmp_table_size 会有一些好处。