3

我目前正在构建一个 Web 应用程序,它需要访问一个(非常)大的字符串数据库并将它们与给定的“请求字符串”进行比较 - 这必须使用不同的比较方法(相同单词的数量,单词的顺序......)并且应该是可扩展的,更重要的是,快速。

我考虑过在C中实现比较方法本身,因为它显然比解释的要快得多,尽管有更多像 PHP 这样的“webby”语言。这让我想到了三个问题:

1)我应该如何将 C 应用程序“连接”到 Web 服务器(当前为 Apache)?我考虑过通常的 CGI 方式,但由于它需要为每个请求创建一个新进程,因此它的可扩展性和速度会降低——至少我是这么读的。

2) 对于这个用例,哪种数据库技术最适合与 C 一起使用?

3)最后但并非最不重要的一点是,您认为值得奋斗还是通过构建连接到 MySQL 数据库的 PHP 脚本来走通常的方式就足够了 -速度差异有多大?

在此先感谢,大卫

4

2 回答 2

2

糟糕的应用程序架构、糟糕的数据库设计和糟糕的代码总是会低效运行、缓慢且无法扩展。

如果你把它排除在外,大多数“非常高需求”的目的都可以用任何解释语言来服务 - 请记住它们在他们所做的事情上进行了优化(例如浪费内存,但即使对于高需求使用通常也很快) .

话虽如此,我们得到了真正的答案:

在数据库设计中,没有适用于所有用例的完美方法。您可能需要以一种方式构建数据库以实现最佳读取速度,以另一种方式实现最佳写入速度,再以另一种方式实现最佳灵活性(但会牺牲读取和写入速度)。一个部分可能需要高读取速度,另一个部分可能需要高写入速度,而另一个部分可能需要高灵活性。

想想你设计数据库的方式并问自己“我是否需要在一个会话中连接到数据库 300 次以收集所有数据,或者我是否可以编写一个可以一次读取所有数据的大语句”如果不是这样很容易实现 想想如果你可以编写一个 SQL 存储过程,如果你再次空出来,想想你是否可以改变结构(例如牺牲灵活性)以允许单行读取或存储过程读取。

在任何情况下,从 PHP 到 MySQL 的多对多连接发送 1 个查询意味着您要花费大量时间等待 PHP 通过网络连接到 MySQL 服务器(即使它是本地的)以及让 MySQL 处理请求和提供答案等等等等。如果您可以将要发送的所有语句批量生成到一个字符串中,那就太好了,如果不能,如果您可以将它们分组为较小的批次,那也可以。

如果以上所有内容都不可接受,或者如果您今天真的有编写 C 脚本的诀窍(无论如何都是值得称赞的意图):

您应该考虑编写一个 C MySQL 模块来定义一些 UDF - 用户定义的函数。他们可以在 MySQL 读取行级数据时访问它,并且可以处理输出聚合和所有这些爵士乐。

编写 apache 模块或 PHP 模块将以与 MySQL 模块大致相同的格式提供数据,但处理不会在 MySQL 服务器内部运行,它将从 MySQL 请求数据,处理它并请求更多数据。

于 2012-10-18T21:12:48.110 回答
0

Apache-2.4.x 有 mod_dbd,它可以直接从 Apache 配置文件中与各种数据库后端(使用预编译查询来提高速度)对话。例如,这可以在mod_rewrite 的规则中使用,以根据查询结果更改传入请求。

换句话说,根据您的应用程序的详细信息,您可以完全避免编码。

但是,如果您确实必须编写代码,我建议您首先使用您最熟悉的语言来实现原型。很有可能,它会“足够快”——或者每个请求花费的大部分时间都在数据库端,从而使语言的选择变得无关紧要。

从 C 连接到数据库后端很容易——每个数据库供应商都有(至少一个)C 程序的客户端库实现。

如果您的应用程序不需要多个 HTTP 服务器来与同一个(单个)数据库通信,那么您最好的数据库将是本地数据库:SleepyCat(现在是 Oracle)的“db”、gdbm 或 SQLite3。

此外,如果更新(对数据库的更改)不频繁,您可以使用平面文件并在内存中构建数据库......这将限制数据库的最大大小,但将是最快的并允许您避免处理(重新)连接等

编辑:memcache 是一个外部数据库——无论它是在同一个系统上还是在远程系统上运行,你都必须连接到它,与之交谈,并将数据从它的内存复制到你的内存中。如果数据库更改不频繁,则最好将内容保存在自己的内存中并直接从那里使用。

于 2012-10-18T20:41:59.513 回答