我正在开发一个基于pdo的数据库类,使用的数据库是mysql数据库,但我想缓存数据库以获得更高的性能。将数据库缓存在 SQlite 内存数据库中并对此执行 SELECT(并在 INSERT、UPDATE 等上更新数据库)数据库是否是个好主意? 但是,当我写“cache = new PDO('sqlite:memory'); ”时,它是创建一个新的还是使用现有的数据库?另外,如果一台服务器托管多个网站,如何使用不同的内存数据库?
最佳答案
每个 SQLite 内存数据库都是特定于连接的。即使您在同一进程中打开到 :memory: 的两个连接,也会创建两个单独的内存数据库。所以答案是总是创建一个新的数据库,它从不使用现有的数据库。
请谨慎使用正确的名称来创建内存数据库。 :memory: 以外的任何其他名称(如 :memory: 或 memory 或 /:memory:)都不会实际上创建的不是内存数据库,而是一个基于文件的常规数据库。这会悄无声息地发生。
使用建议的缓存获得的性能增益可能很小。如果您在 MySQL 上进行选择并且计算机有足够的内存,由于操作系统磁盘缓冲,数据很可能已经在 RAM 中。因此,以 SQLite 内存数据库的形式添加另一层 RAM 不会有太大帮助。
如果系统不是只读的,建议的缓存很容易导致复杂或不正确的缓存逻辑。如果某个进程进行数据更新,它必须更新其缓存,更新 MySQL 数据库,并且您还必须创建某种机制来告诉其他进程它们的缓存不再有效并且它们必须从 MySQL 读取数据。否则你的数据很快就会变得一团糟。想想当两个进程决定同时更新相同数据但更新为不同值时会发生什么?你有冲突。
为了获得更高的性能,我会首先调整服务器和 MySQL。如果这还不够,我会添加一个像 Memcached 这样的缓存,它不是特定于应用程序进程而是一个单独的进程。即使这样,您也必须小心构建应用程序逻辑,使数据在更新时保持一致。如果您只使用 MySQL 并使用 InnoDB 进行正确的事务处理,那么 MySQL 会为您完成。
关于PHP:数据库缓存(内存中有 sqlite),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10055216/