在内存中缓存MySQL数据库


11

我在使用600MB MySQL数据库的网站时遇到问题。该网站太慢了。我注意到MySQL数据库越大,运行速度越慢。当它为5MB时,该网站非常快。当它开始变大时,它开始变得越来越慢,现在达到600MB,确实很慢,加载页面大约需要10秒。

我检查了最重要的进程,它与高负载或任何东西都没有关系。正如我在HDD 7.2k rpm驱动器上进行测试时,它甚至与IOPS都不相关,而在使用Intel 320 SSD驱动器进行测试时,它也出现了相同的问题,因此我也不认为这与高查询量有关。

该网站正在使用Wordpress,并且有9个活动的插件。人们说这可能是插件...也许吧...但是现在我只想将整个数据库缓存在内存中,并希望获得有关从何处开始以及如何执行的帮助和指导。

我有16GB RAM和i5-2400 4核@ 3.1 GHz。操作系统是centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached

Answers:


10

如果我是你,我会将所有数据切换到InnoDB。表锁定/行锁定早已被许多人讨论。我总是会选择InnoDB。但是,选择InnoDB ... CACHING还有另一个深刻的原因

虽然大多数人吹嘘MyISAM的读取速度更快,但大多数人却忘记了MyISAM的许多缓存(称为密钥缓存(由key_buffer_size设置))仅缓存.MYI文件中的索引页。它从不缓存数据页。在32位系统中,它的官方最大容量为4GB。对于64位,最大最大为8GB。

InnoDB缓冲池缓存数据和索引页。根据您拥有的服务器,您可以在RAM中最多缓存整个数据集。您可以为InnoDB调整最多80%的RAM,为DB Conenctions调整10%的空间,为OS保留10%的空间。即使对于不同的操作系统也是如此

我已经为Drupal客户推荐了这些东西,并取得了巨大的成功。它也适用于Wordpress。我已经为使用WordPress的客户端提供了数据库支持。同样的改进。

您始终可以更有效地为InnoDB配置内存,从而可以配置更多MyISAM。总有一种方法可以满足您的性能需求。随着数据的增长,最终将成为一种需求

更新2011-11-21 11:44 EST

如果您的完整数据集足够小,则可以在mysql启动后立即对每个表执行SELECT查询。

对于所有InnoDB和/或MyISAM表,请运行以下查询:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

这将输出您需要运行的所有可能的SELECT查询,该查询将召唤所有要引用的索引。将此查询放在一个名为/root/MakeSelectQueriesToLoad.sql的文件中。运行脚本并收集输出/root/SelectQueriesToLoad.sql。最后,运行它:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

这肯定会将所有索引页预加载到InnoDB缓冲池和MyISAM密钥缓存中。如果您所有的数据都是InnoDB,请进行两项更改:

  • 替换WHERE engine IN ('InnoDB','MyISAM')WHERE engine='InnoDB'
  • 替换CONCAT('SELECT ',ndxcollist,' FROM ',CONCAT('SELECT * FROM ',

这还将把更多数据页面填充到InnoDB缓冲池中。

最后提示:确保InnoDB缓冲池足够大,可以容纳所有InnoDB数据


2

您已经将整个数据库缓存在内存中。问题几乎可以肯定是搜索数据库所需的时间,即使在RAM中也是如此。

观察您的磁盘I / O统计信息。您可能会看到偶尔有磁盘I / O的随机位。该数据库在内存中。那不是问题。您需要先安装iostat。您没有提及平台或发行版,但可能在名为的软件包中iostat。您可能会发现atop更友好。

告诉您这样做的人是在得到所有证据表明整个数据库尚未在内存中还是磁盘I / O出现问题之后这样做的吗?否则,他们的建议相当于没有看过或检查过您,但只是听说您的手臂受伤告诉您将其放在石膏上的医生。


-1

为Wordpress安装一个好的缓存插件,可能会有所帮助。但是迟早,您必须找出降低系统速度的瓶颈。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.