为只读优化 MySQL?

tir*_*ing 6 mysql innodb myisam optimization hardware

我们有 14 GB 的 CSV,总计 1.38 亿行。我首先使用 InnoDB 将其导入到 MySQL 表中,然后使用 MyISAM 再次尝试。在这两种情况下,对主键(只是一个自动递增的 int)的简单 SELECT 需要 6-7 秒,尽管 MyISAM 有时在 5-6 秒时快一点。

我们只需要写一次数据,我一直在使用mysqlimport。考虑到这一点,如何提高查询速度?

...我们有 2 演出 RAM 并且一切都是一张表,这毫无价值(并且由于查询的性质,它必须保持这种状态)。考虑到硬件,这是我可以期待的最佳性能吗?或者还有什么我应该尝试的,比如压缩?或者真的,我需要更多的内存?

Rol*_*DBA 3

MyISAM 行格式

如果表中有很多 VARCHAR 字段,我很乐意建议以下内容

对于您加载的每个 MyISAM 表,请预先执行此操作

ALTER TABLE mytable ROW_FORMAT=Fixed;
Run Code Online (Sandbox Code Playgroud)

这将在不改变任何其他内容的情况下将查询性能提高高达 15-30% 。这样做的副作用是拥有更大的表和更大的索引。

我之前有过关于此的帖子:

增加内存

如果您有许多索引,您可能需要增加数据库服务器上的 RAM,然后尝试将所有 MyISAM 索引页预加载到键缓冲区中。

首先计算您想要多大的密钥缓冲区(以千兆字节为单位)

SELECT CEILIING(SUM(index_length)/POWER(1024,3)) SuggestedKeyBufferSize
FROM information_schema.tables
WHERE engine='MyISAM' AND table_schema NOT
IN ('information_schema','performance_schema','mysql');
Run Code Online (Sandbox Code Playgroud)

如果SuggestedKeyBufferSize可以为DB Server设置,则执行以下操作(例如4G)

步骤 01) 在 /etc/my.cnf 中设置

[mysqld]
key_buffer_size=4G
Run Code Online (Sandbox Code Playgroud)

STEP 02) 预加载所有MyISAM索引

请参阅我关于如何执行此操作的帖子:MySQL 热过程