我正在开发一个基于pdo的数据库类,使用的数据库是一个mysql数据库,但我想缓存数据库以获得更多性能。将数据库缓存在SQlite内存数据库中并对此进行SELECT(并在INSERT,UPDATE,...上更新数据库)db是不是一个好主意? 但是,当我写" cache = new PDO(' sqlite:memory'); "它是创建一个新的还是使用现有的数据库?另外,如果一台服务器托管多个网站,那么如何使用不同的内存数据库呢?
答案 0 :(得分:2)
每个SQLite内存数据库都是特定于连接的。即使在同一进程中打开与:memory:的两个连接,也会创建两个单独的内存数据库。所以答案是始终创建一个新数据库,它永远不会使用现有数据库。
使用正确的名称来创建内存数据库时要小心。除:memory:之外的任何其他名称(如:memorry:或内存或 /:memory:)不会# 39;实际上是创建内存数据库而是基于常规文件的数据库。这是无声无息的。
使用建议的缓存获得的性能提升可能很小。如果您选择在MySQL上并且计算机有足够的内存,则由于操作系统磁盘缓冲,数据可能已经在RAM中。因此,以SQLite内存数据库的形式添加另一层RAM不会有太大帮助。
如果系统不是只读的,建议的缓存很容易导致复杂或不正确的缓存逻辑。如果某个进程执行数据更新,它必须更新其缓存,更新MySQL数据库,并且还必须创建一些机制来告诉其他进程它们的缓存不再有效,并且它们必须从MySQL读取数据。否则你的数据很快就会变得一团糟。并且想想当两个进程决定同时更新相同数据但不同值时会发生什么?你有冲突。
为了获得更高的性能,我首先要调整服务器和MySQL。如果还不够,我会添加一个像Memcached这样的缓存,它不是特定于应用程序进程的,而是一个单独的进程。即使这样,您也必须小心地以数据在更新时保持一致的方式构建应用程序逻辑。如果您只使用MySQL并使用InnoDB进行正确的交易,则MySQL会为您做到这一点。