我有大型 MySQL表(200K +记录)。从这张表中,我主要阅读最后的+1000条记录。在这张表中,我每天插入约500条记录。 我的问题。我应该使用这一个表并从中读取,还是应该使用一个较小的表,用作缓存。
我的缓存表的含义是: large 表的每次插入都会启动触发器,将数据复制到“cache”表并删除旧表(以保持范围内的大小)最多1000条记录)。现在,如果我读了一些东西,我主要在“cache”中搜索“最后的条目记录”。用户是否想要读取“存档”数据,我从 large 表中读取。
这是一个好的解决方案,还是运行触发器并从缓存表中删除会影响性能?或者......会有什么不同吗?
我主要运行的SQL查询包含SELECT
个,其中包含两个JOIN
s并在范围内搜索结果(使用HAVING
子句)。我正在使用MyISAM数据库引擎。
答案 0 :(得分:1)
您可以自己检查 - 使用
创建第二个表create table cache as select * from orig_table order by insertiontime desc limit 1000
然后将相同的索引添加到原始表所具有的缓存表中,并在原始表上执行一些选择,并在缓存表上进行相同的选择。在每种情况下测量时间。
如果你有适当的索引,并且你的结果集大小是相同的(即你没有选择缓存表中没有的原始表中的所有旧记录),时差不应该更多不到百分之几。
每天做一次analyze table可能会有所帮助,以防止mysql对密钥分发产生奇怪的想法并使用次优的连接顺序。
如果要排除无法阻止原始联接选择的旧记录,您可能需要阅读partitioning,这与您的缓存构思类似但在数据库引擎中实现