要点: 我还没有能够让MySQL使用超过1个内核的select语句,并且它不会超过10或15 GB的RAM。
机器: 我有一个使用MySQL 5.6运行MariaDB的专用数据库服务器。该机强大,48核和192GB内存。
数据: 我在一个大表中有大约2.5亿行(还有其他几个表,范围从5到1亿行)。我一直在从表中读取大量内容,有时会插入到新表中以对数据进行非规范化处理。我不是将此系统设置为事务系统,而是将其用于更少类似于具有少量连接的数据仓库。
问题: 当我查看我的服务器的统计数据时,对于运行了选择查询的一个核心,CPU看起来大约为70%,而内存大约为5-8%。没有IO等待,所以我确信我的MySQL内存分配有问题。在搜索了如何增加MySQL内存使用量后,我注意到配置文件可能是增加内存使用量的方法。
我根据在线搜索尝试的解决方案: 我已将表更改为MyISAM引擎并添加了许多索引。这有助于提高性能,但查询这些表仍然非常缓慢。使用加载数据infile的写入速度非常快,但运行温和复杂的选择查询需要数小时甚至数天。
我也尝试调整以下配置:
key-buffer-size = 64G
read_buffer_size = 1M
join_buffer_size = 4294967295
read_rnd_buffer_size = 2M
key_cache_age_threshold = 400
key_cache_block_size = 800
myisam_data_pointer_size = 7
preload_buffer_size = 2M
sort_buffer_size = 2M
myisam_sort_buffer_size = 10G
bulk_insert_buffer_size = 2M
myisam_repair_threads = 8
myisam_max_sort_file_size = 30G
max-allowed-packet = 256M
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 0
max-connections = 500
thread-cache-size = 150
open-files-limit = 65535
table-definition-cache = 1024
table-open-cache = 2048
这些配置更改略微改善了使用的内存量,但我希望能够使用80%的内存......或者尽可能地获得最大性能。关于如何增加MySQL内存分配的任何想法?
答案 0 :(得分:0)
由于您已经没有IO等待,因此您正在使用大量内存。你的缓冲区看起来也很大。因此,我怀疑使用额外内存可以节省大量CPU。您受到单核的CPU功率的限制。
两种策略可能有所帮助:
使用EXPLAIN或查询分析器查明是否可以优化查询以节省CPU时间。添加缺失的索引可能会有很大帮助。有时您也可能需要组合索引。
评估更适合分析查询的备用存储引擎(甚至数据库),并且可以使用所有核心。 MariaDB支持InfiniDB,但也有其他存储引擎和数据库,如Infobright,MonetDB。
答案 1 :(得分:0)
使用显示全局变量,例如"%thread%"你可能会得到一些关于启用线程并发选项的线索。
在2M测试的read_rnd_buffer_size(16384),您的数据可能会大大缩短完成查询所需的时间。