全局困境 - 存储很少改变的数据库中的值

时间:2013-05-30 14:03:26

标签: php database-design

我不确定如何以一种有效运行Web应用程序的方式来解决这个问题。我担心正确实施这个,因为我正在与流量很大的网站合作。

我在MySQL数据库中有3个表,这些表中的值很少改变但引用相当多。在PHP中存储和访问该数据的最佳方法是什么?

表格示例:

GENRES   
+----+-----------+-----------+---------------+--------------+---------------------+
| id | is_active | name      | content_limit | thumbnail    | thumbnail_active    |
+----+-----------+-----------+---------------+--------------+---------------------+
|  1 | ☺         | Animals   |            65 | Animals.png  | Animals_Active.png  |
|  2 | ☺         | Art       |            30 | Art.png      | Art_Active.png      |
|  3 |           | Biography |             0 | NULL         | NULL                |
|  4 | ☺         | Children  |            50 | Children.png | Children_Active.png |
|  6 | ☺         | Fantasy   |            15 | Fantasy.png  | Fantasy_Active.png  |
|  7 |           | Fiction   |             0 | NULL         | NULL                |
|  8 |           | Health    |             0 | NULL         | NULL                |
| 10 |           | Music     |             0 | Music.png    | Music_Active.png    |
| 11 |           | Politics  |             0 | NULL         | NULL                |
+----+-----------+-----------+---------------+--------------+---------------------+

SERVERS
+----+-----------+-------+----------------------------+-------------------------+-------------+
| id | is_active | name  | url                        | webserver_document_root | description |
+----+-----------+-------+----------------------------+-------------------------+-------------+
|  1 | ☺         | name1 | http://server1.website.com | /dir1                   |  NULL       |
|  2 | ☺         | name2 | http://server1.website.com | /dir2                   |  NULL       |
+----+-----------+-------+----------------------------+-------------------------+-------------+

2 个答案:

答案 0 :(得分:2)

始终访问数据库非常昂贵。

最近安装了APC的PHP发行版。 APC效率很高。 APC将使用密钥索引的数据存储在共享内存中(因此可从所有分叉的PHP进程访问)。

您必须告诉APC(在apc.ini的选项中)您要保留多少MB或GB。

然后您可以非常快速地存储和检索值。

E.g。你可以存储

的值
1 | ☺         | Animals   |            65 | Animals.png  | Animals_Active.png 

作为

'1:1:Animals:65:Animals.png:Animals_Active.png'

apc_store("key1", '1:1:Animals:65:Animals.png:Animals_Active.png');

或初始化PHP以从数据库所有行加载一次并将它们存储在APC中。
然后,从'key1'

中检索数据
$arr = explode(':', apc_fetch("key1"));
数组$arr中的

在此示例中,数据库中的密钥为1。因此,您可以将APC键命名为key1 ...
检索一堆数据(例如,从0到9的键)

$alldata = array();

for ($key=0 ; $key<9 ; $key++) {
   $arr = explode(':', apc_fetch("key$key"));
   // process that row if necessary
   $alldata[] = $arr;
}

然后,您可以使用一行数据,这要归功于

$alldata[ $somekey ]

和该行的元素

$alldata[ $somekey ][ 2 ]

会给Animals

答案 1 :(得分:0)

如果有简单的条件来访问数据(例如只有主键),我会使用Redis这样的生命周期缓存来存储数据,其中key就像table_name:id