我一直在努力优化性能基于php和mysql的庞大软件。我已经完成了Apache中的缓存和MySQL中的索引,但这还不够。 由于该软件中的所有表单都是从数据库中的配置动态构建和打印的,因此软件会发送大量的SQL并进行大量连接,这会在连接多个并发用户(平均200-300)时减慢整个过程。
由于我们无法触及代码,因此我看到 mysql-proxy 可以放在应用服务器和数据库服务器之间,在那里可以缓存查询结果,访问 redis o memchached 通过 lua 。我的想法是缓存一切。但是,问题是缓存无效。更新记录后,如何使所有缓存的结果集无效?
其中一个想法是将SQL查询转换为md5并将结果存储为集合的键。而且还要分析查询并存储相同的md5键和对表的引用。例如:
查询:
select * from products left join users on products.user_id = user.id
缓存实例A
3b98ab273f45af78849db563df6598d1– {result set}
缓存实例B
products - 3b98ab273f45af78849db563df6598d1
users - 3b98ab273f45af78849db563df6598d1
因此,一旦在这些表上发出UPDATE或INSERT或DELETE,它将使查询特定表的所有结果集无效。
我看到了相当多的工作,我想知道是否有更简单的方法来实现这一目标。