1

我正在研究基于 pdo 的数据库类,使用的数据库是 mysql 数据库,但我想缓存数据库以获得更高的性能。将数据库缓存在 SQlite 内存数据库中并对此执行 SELECT (并在 INSERT、UPDATE、...上更新数据库)数据库是否是个好主意?但是,当我写“cache = new PDO('sqlite:memory');”时,它是创建一个新的还是使用现有的数据库?另外,如果一台服务器托管多个网站,如何使用不同的内存数据库?

4

1 回答 1

2

每个 SQLite 内存数据库都是特定于连接的。即使您打开两个到:memory:的连接,在同一个进程中也会创建两个单独的内存数据库。所以答案是总是创建一个新的数据库,它从不使用现有的数据库。

请谨慎使用正确的名称来创建内存数据库。:memory:以外的任何其他名称(例如:memorry:memory/:memory:)实际上都不会创建内存数据库,而是基于常规文件的数据库。这无声无息地发生。

使用建议的缓存获得的性能提升可能很小。如果您在 MySQL 上进行选择并且计算机有足够的内存,则由于 OS 磁盘缓冲,数据可能已经在 RAM 中。因此,以 SQLite 内存数据库的形式添加另一层 RAM 并没有多大帮助。

如果系统不是只读的,建议的缓存很容易导致复杂或不正确的缓存逻辑。如果某个进程进行数据更新,它必须更新其缓存,更新 MySQL 数据库,并且您还必须创建一些机制来告诉其他进程它们的缓存不再有效,它们必须从 MySQL 读取数据。否则你的数据很快就会变得一团糟。想想当两个进程决定同时更新相同的数据但更新为不同的值时会发生什么?你有冲突。

为了获得更高的性能,我首先会调整服务器和 MySQL。如果这还不够,我会添加一个像 Memcached 这样的缓存,它不是特定于应用程序进程的,而是一个单独的进程。即使这样,您也必须小心地以数据在更新时保持一致的方式构建应用程序逻辑。如果你只使用 MySQL 并使用 InnoDB 进行正确的事务,那么 MySQL 会为你做这件事。

于 2012-04-07T23:41:54.307 回答