缓存静态表Mysql

Posted

技术标签:

【中文标题】缓存静态表Mysql【英文标题】:Cache Static Tables Mysql 【发布时间】:2013-01-02 09:20:28 【问题描述】:

在 EF 5.x 和 MVC3 中使用 mysql。我有一张大约有 320 万行的表格,其中包含城市、国家/地区组合。我在客户端有一个自动完成文本框,它接受城市的搜索词并使用 jQuery/ajax 发回建议。

我面临的挑战是,当它第一次使用时,我将这张表缓存到我的内存中:

        CityData = DataContext.Citys.OrderBy(v => v.Country).ToList();

        if (CityData.Any())
        
            // Put this data into the cache for 30 minutes
            Cache.Set("Citys", CityData, 30);
        

即使我将 db-context 超时设置为 5 分钟,它也会超时。当我使用 MySQL 客户端对数据库运行此 SQL 时,大约需要 3 分钟来提取所有行。

将这些数据读入缓存的最佳方法是什么,或者我应该做些什么不同的事情? 如果可以,我可以将表直接缓存到 MySQL 缓存中吗?或者我应该将术语搜索直接发送到数据库,而不是使用缓存中的数据。

【问题讨论】:

如果是为了自动完成,你不会有一个使用搜索词并且只获取相关结果的查询吗?还是您希望搜索查询运行缓存数据? @MikeSmithDev 提出了一个很好的观点,你最好将单个查询缓存到数据库中。您可以将查询缓存很长一段时间,这样一段时间后,您的大部分搜索将不会进入数据库。您还可以选择将生成的 json 缓存为文件,这样一收到这样的请求就可以返回 json 文件。 是的,搜索词与缓存数据不符 在实际表中搜索您的搜索词是否有问题,因此需要缓存版本?表是否被索引?如果您在 SQL 客户端中的查询需要 3 分钟...那就有点麻烦了。 我认为没有必要缓存。像这样的简单数据库查询需要 1ms 左右。不值得优化。 【参考方案1】:

同意 cmets 对您的问题的看法,我还建议您使用这么多行,您可能会限制自动完成的回报? (即进入前 10 名)。除非您尝试在每次击键时返回所有结果,否则往返数据库不应成为主要瓶颈。

如果这是一个瓶颈,我可能会通过在每次击键时对数据库进行异步调用来解决这个问题,同时继续过滤您已经在本地提取的结果。我认为,在数据库中重新排序列表并重新查询比尝试在代码中执行此操作的性能损失更快 - 如果我正确理解您的意图/问题。

警告:我还没有处于这样的位置,即数据库方法的通用往返速度不足以满足我的需求/自动完成中的数据量 - 其他人必须在这里解决性能问题可能能够提供额外的见解 - 任何谷歌工程师阅读? :)

【讨论】:

再想一想 - 我会有点谨慎地尝试解决您在实际成为问题之前预期会遇到的性能问题。根据个人经验,我浪费了很多时间尝试编写聪明的代码来解决我无论如何都不会遇到的问题。 那是因为你在编写聪明的代码时解决了它们 :) 我很想相信...但这只会鼓励更多不良行为:)

以上是关于缓存静态表Mysql的主要内容,如果未能解决你的问题,请参考以下文章

Mysql系列:存储引擎

linux静态路由表和动态路由表在内核吗

MySQL中四种常用存储引擎的介绍

MySQL中四种常用存储引擎的介绍

MySQL 静态表的最佳索引

如何用arp命令添加一项静态ARP缓存