【问题标题】:Can Joomla handle Queries for Millions of Users in the jos_users table?Joomla 可以处理 jos_users 表中数百万用户的查询吗?
【发布时间】:2012-05-01 20:50:37
【问题描述】:

我几乎完成了一个大型网站的开发。

唯一的问题是我总是让 MySQL 消失错误...

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

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

我花了将近 5 个月的时间来开发这个......现在虽然我在一个 Quad 专用服务器(2 GB 内存)上,但我觉得 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

【问题讨论】:

  • 如果没有关于您的 MySQL 服务器配置、服务器负载(例如,每分钟多少流量?)和其他因素的一些信息,我们无法对您的案例说任何有用的信息,所以如果你可以更新你的问题,这会很有帮助:)
  • 在给定时间是 500 万注册用户(即 500 万数据库行)还是 500 万用户?如果是后者,那么您的网站就很受欢迎,请吸引一些投资者并提升这些服务器!
  • 这是一个求职网站...我已将用户导入 joomla 数据库...我的意思是我已将求职者导入 jos_user 表...
  • 导入了大约 500 万用户...@Daan:我会尽快提供我的服务器的详细信息
  • 不是 CMS 类型就是这个问题的答案,它是主机和服务器。看到你有一个专用的服务器,我相信它会没事的。如果事情变得太多,那么你应该按照 Damien Pirsy 所说的去做。

标签: php mysql joomla


【解决方案1】:

好的!没问题。您必须意识到这是 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:

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

解决方案#3:

您可以将表拆分为更多数据库。在您的自定义身份验证模块中,尝试使用“联合”或一个一个地在单个查询中一个一个地访问所有数据库(这样您可能会保存一些数据库命中)。您可以按用户名对它们进行排序,这样当他们登录时,您就会知道要访问哪个数据库。这将大大减少您的点击次数。

解决方案#4:

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

结论:

尽管将数据库和一个表分割成许多部分看起来很愚蠢,但实际上这是你这样做的理想时机。它不会花费您太多时间,也不会损害您的 Joomla/数据库。不过很容易逆转!

我希望所有这些都对你有用。我认为将所有这些放在一起没有任何问题,除了它会给您带来工作开销,但实际上当您的数据库中有超过 500 万条记录时它是可以接受的。

我真的很希望这对你一起做所有这些事情有很大帮助。

【讨论】:

  • 如果这些确实是当您在 Joomla 的用户数据库中拥有一百万条记录时需要使用的真正解决方案,我有点担心。如果它有适当的索引应该没什么大不了的......
  • 好吧,我并不是说它们是真正的解决方案,但我已经在我的案例中实现了其中的一些,对此我感到非常满意。即使您对表进行了索引,最好将 500 万条记录拆分到一个或多个数据库中,这样您的执行速度会更快。我没有看到任何缺点,因为它仍然很容易升级,很容易在 Joomla CMS 中进行其余的编程。我一开始已经说过它在 Joomla 中! CMS 限制边界。
  • 是的,这不是对您的具体答案的评论(据我所知,这本身就很好),只是关于 Joomla 本身:) 无论如何,你说得对,集群会有所帮助与性能。
  • 谢谢你,但解决方案#2 和解决方案#3 对于像我这样的菜鸟来说有点难以理解......你可以吗?详细解释一下..谢谢
  • 我尝试了 sol#1 和 sol#2 但没有区别..仍然出现致命错误:允许的内存大小为 314572800 字节已用完...
猜你喜欢
  • 1970-01-01
  • 2014-12-07
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多