【问题标题】:Load a MySQL innodb database into memory将 MySQL innodb 数据库加载到内存中
【发布时间】:2010-03-21 05:46:36
【问题描述】:

我有一个 1.9GB 的 MySQL innodb 数据库,通过以下命令显示。

SELECT table_schema "Data Base Name"
     , sum( data_length + index_length ) / 1 048 576 
       as "Data Base Size in MB"
     , sum( data_free )/ 1 048 576  
       as "Free Space in MB"
FROM information_schema.TABLES
GROUP BY table_schema ; 

+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| database_name      |        1959.73437500 |   31080.00000000 | 

我的问题是:

  1. 这是否意味着如果我将 innodb_buffer_pool_size 设置为 2GB 或更大,整个数据库可以加载到内存中,从而需要从磁盘请求中读取更少的数据?

  2. 31GB的可用空间是什么意思?

  3. 如果可以分配给 innodb_buffer_pool_size 的最大 RAM 为 1GB,是否可以指定将哪些表加载到内存中,同时保持其他表始终从磁盘读取?

提前致谢。

【问题讨论】:

    标签: mysql memory caching innodb ram


    【解决方案1】:
    1. 不完全是。 InnoDB 缓冲池用于缓冲读取和写入。如果您的大部分访问都被读取,那么大部分访问将被缓存,并且需要更少的磁盘访问。
    2. 可能是这个bug,它没有很好地记录,但我认为 data_free 是 innodb 文件中的可用空间(如果你写的比这个 InnoDB 多,则必须扩大数据文件)。
    3. 不会,但 InnoDB 会自动缓存您最常访问的数据,因此无论如何它应该具有最佳效果。

    如果您需要更好的性能,请考虑使用 memcached 作为缓存层以完全消除数据库访问。

    【讨论】:

      【解决方案2】:
      1. 最好担心有足够的内存来缓存内存中的索引,并将数据留在磁盘上。如果每次都必须从磁盘读取索引,则数据库性能会受到很大影响 - 远远超过稍后从磁盘检索所需数据的开销。
      2. InnoDB 数据文件以固定大小创建,如果它们已满,可以选择自动扩展(创建额外文件)。您可以使用show variables like 'innodb_data_file_path' 查看每个文件的大小。报告的可用空间是当前数据文件中有多少未使用。在您的情况下,您有 2gigs 的数据存储在(很可能)32gigs 的 InnodB 数据文件中,剩下 30gig 可用。
      3. 您是否有任何理由要绕过 InnoDB 自己的缓存逻辑来固定 ram 中的特定表?缓存自然会倾向于将最常访问的数据保存在 ram 中,如果您强制它保存使用较少的数据而不是最受欢迎的数据,性能无疑会受到影响。

      【讨论】:

        猜你喜欢
        • 2019-03-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多