MyISAM 的 MySQL 性能调优

rho*_*rho 4 mysql myisam performance

我需要对 mysql 服务器进行性能调整并需要帮助。

我有一个专用于 MySQL 的 16G 服务器,其中有 1 个 MyISAM 表,其中大约有 200 万行,可以获取大量流量。同一个数据库上还有大约 100 个其他 innodb 表。MyISAM 表几乎是只读的,用户使用它进行搜索。

服务器的 max_connection 值为 800,在大约 300 个并发用户的负载测试下,查询时间开始显着增加。在没有负载的情况下,查询需要大约 500 毫秒才能运行。

目标是显着提高 MyISAM 表上的搜索性能。

表的大小(以 MB 为单位):

data_size   index_size  total           engine
8991        6920        15911           InnoDB
1110        718         1829            MyISAM
Run Code Online (Sandbox Code Playgroud)

以下是我的设置:

connect_timeout 10
innodb_additional_mem_pool_size 24117248
innodb_buffer_pool_size 12G
innodb_commit_concurrency   0
innodb_flush_log_at_trx_commit  1
innodb_log_buffer_size  11534336
innodb_log_file_size    449839104
innodb_open_files   300
innodb_thread_concurrency   8
innodb_thread_sleep_delay   10000
join_buffer_size    131072

key_buffer_size 2147483648
key_cache_age_threshold 300
key_cache_block_size    1024
key_cache_division_limit    100


max_allowed_packet  134217728
max_connections 800
max_delayed_threads 20
max_join_size   18446744073709551615
max_user_connections    0


myisam_max_sort_file_size   107374182400
myisam_mmap_size    18446744073709551615
myisam_sort_buffer_size 70254592

open_files_limit    2048

query_cache_limit   104857600
query_cache_min_res_unit    4096
query_cache_size    419430400
query_cache_type    ON

read_buffer_size    262144

socket  MySQL
sort_buffer_size    2097152

table_type  InnoDB
thread_cache_size   100
thread_handling one-thread-per-connection
thread_stack    262144

tmp_table_size  1073741824
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 8

您在问题中明确说明了您的目标

目标是显着提高 MyISAM 表上的搜索性能

好的,让我们调整事物的 MyISAM 方面。

我有四(4)条建议给你

建议#1:减少你的内存

首先,回顾 5 年前,请注意我在对帖子的回答中所说的话InnoDB 和 MyISAM 之间的主要区别是什么?:MyISAM 存储引擎仅缓存来自.MYIMyISAM 表的索引页。

你设置key_buffer_size2147483648,那2G。然而,您的 MyISAM 索引总共只有 718M。您需要减少key_buffer_size768M仅释放 1.2G 的 RAM。

建议 #2:将所有 MyISAM 索引加载到 RAM 中

许多人没有意识到这一点,但是您可以将一个或多个索引从 MyISAM 表加载到 RAM 中。它被称为专用密钥缓存。3.5 多年前,我在我可以部分使 MySQL 表缓存失效吗?(见建议#1)。它也在 MySQL 文档中:请参阅缓存索引语法

建议 #3:将所有 VARCHAR 扩展为 CHAR

如果 MyISAM 表有很多VARCHAR字段,您可以使用一个 DDL 命令使VARCHAR字段表现得像 aCHAR

ALTER TABLE myisamtable ROW_FORMAT=FIXED;
Run Code Online (Sandbox Code Playgroud)

这将扩展表的方式是 a 的数据类型VARCHAR(32)实际上一直是 32 字节宽,就像 a 一样CHAR(32)。这可能会使 MyISAM 表的大小增加一倍或三倍,但您可以将读取速度提高 20-25%。

我写过很多次了

如果您这样做,您将需要返回并测量 MyISAM 索引增长了多少。然后,重做SUGGESTION #2并创建新大小的 MyISAM 专用密钥缓存。

建议 #4

尽管 MyISAM 没有 MyISAM 数据的全局缓存,但每个 DB Connection 都有一个本地缓存大小,由read_buffer_size(用于顺序读取)read_rnd_buffer_size(用于索引读取)决定

您已将read_buffer_size设置为256K (262144)。您根本没有设置read_rnd_buffer_size,因此它被设置为256K (262144). 您可能想尝试缓存数据,但要非常小心,因为这两个 MyISAM 数据缓存是针对每个数据库连接的。

试一试 !!!


归档时间:

查看次数:

21050 次

最近记录:

8 年,3 月 前