Joomla可以在jos_users表中处理数百万用户的查询吗?

时间:2012-05-01 20:50:38

标签: php mysql joomla

我差不多开发了一个大型网站。

唯一的问题是我一直让MySQL消失了......

我在stackoverflow上发布了另一个问题,但没有得到我的回答

所以我的问题是Joomla适合大型用户(500万用户)的CMS解决方案吗?

我花了将近5个月的时间来开发这个...现在虽然我在Quad专用服务器(2 GB Ram)上,但我觉得Joomla可能不是这个大型数据库网站的正确解决方案..

编辑:我只想说清楚我不是在谈论流量......它的全新网站。我在谈论一些表中的行数

请告知

MySQL服务器信息:

MySQL error log: /var/lib/mysql/eta.etalenthunt.com.err

root@eta [~]# cat /etc/my.cnf
[mysqld]
safe-show-database
open_files_limit = 5000
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_limit=1M
query_cache_size=100M ## 32MB for every 1GB of RAM
query_cache_type=1
max_connections=100
collation_server=utf8_unicode_ci
character_set_server=utf8
delayed_insert_timeout=40
interactive_timeout=30
wait_timeout=60
connect_timeout=60
thread_cache_size=64
key_buffer=32M ## 32MB for every 1GB of RAM
join_buffer=1M
max_connect_errors=20
max_allowed_packet=16M
table_cache=2048
record_buffer=1M
sort_buffer_size=3M ## 1MB for every 1GB of RAM
read_buffer_size=3M ## 1MB for every 1GB of RAM
read_rnd_buffer_size=3M ## 1MB for every 1GB of RAM
thread_concurrency=8 ## Number of CPUs x 2
myisam_sort_buffer_size=16M
innodb_file_per_table=1
innodb_buffer_pool_size=18M ## (>= 18M)

我正在运行dedi服务器XEON QUAD 2 GB

1 个答案:

答案 0 :(得分:2)

OK!没问题。你必须意识到这是Joomla和Wordpress的常见问题(正如我在另一个问题的另一个问题中向你解释的那样:Is Joomla 2.5 much faster than Joomla 1.5 Querywise

由于您正在处理它过去6个月,并且您已经知道它在这个网站背后有一个庞大的数据库,所以我所说的正是可以帮助您在Joomla CMS的有限范围内。

我认为这是一个您无法在任何Joomla CMS中轻松处理的问题!但是有一些方法(在我看来)你可以在这里和那里减少一点负荷。

你可以按照这两个步骤进行操作,可能会有更多但是让我们先尝试这两个步骤:

解决方案#1:将数据库拆分为2个或更多数据库(我将解释如何做到这一点)
解决方案#2:Hack Joomla核心击中用户和会话表
解决方案#3:将jos_users表拆分为相同数量的记录
解决方案#4:编写一个清理会话表的cronjob

解决方案#1:

步骤1:将您的jos_users和jos_session表放入两个新的独立数据库中。称它们为db_jos_user和db_jos_session

步骤2:从主数据库中删除jos_users和jos_session表。

步骤3:使用各自的名称为每个视图创建视图,并使用该数据库名称指向表。

CREATE VIEW jos_users AS SELECT * from db_jos_user.jos_users;
CREATE VIEW jos_session AS SELECT * from db_jos_session.jos_session;

这实际上会减少数据库大小,实际上也减少了数据库的负载。 Joomla不会感到惊讶,也不会知道它的观点或背后的表格。

解决方案#2:

破解用户身份验证插件,并通过创建数据库的新实例(在以下解决方案中拆分)来验证来自不同数据库的用户。您可以开发一个逻辑来确定要为哪些用户命中哪个表。这样您就可以减少数据库的负载。您可能还必须实现一个逻辑,以将用户插入/更新到各自的数据库中。这是您必须在Core User组件和用户登录模块内部工作的地方。

解决方案#3:

您可以将表拆分为更多数据库。在您的自定义身份验证模块中,尝试使用“union”或逐个将所有数据库一个接一个地查询到所有数据库(这样可以保存一些数据库命中)。您可以在用户名上对它们进行排序,以便在登录时您将知道要访问哪个数据库。这将大大减少你的命中率。

解决方案#4:

编写一个cron作业,该作业在设置的时间间隔内运行,清除会话表。会话表包含属于访客或用户的所有信息。所以你必须记住你定期清理它。如果用户会话处于非活动状态最多20分钟或您想要删除它,也可以执行此操作。您可能需要在您的网站上发布通知,告知用户会话是否会自动删除超过20分钟的活动或更加用户友好。

结论:

尽管在将数据库和特别是一个表切成许多部分时似乎很愚蠢,但实际上它是您实现这一目标的理想时间。它不会耗费你的大部分时间,也不会伤害你的Joomla /数据库。它虽然很容易逆转!

我希望所有这些对您有用。我没有看到所有这些一起做任何问题,除了它给你一个工作开销,但实际上当你的数据库中有+ 5mn记录时它是可以接受的。

我真的希望这能帮助你在一起做所有这些事情。