【问题标题】:What's quicker; including another file or querying a MySQL database in PHP?什么更快;包括另一个文件或在 PHP 中查询 MySQL 数据库?
【发布时间】:2010-09-15 00:48:11
【问题描述】:

在 PHP 中,这更快;使用include('somefile.php') 或使用简单的SELECT 查询查询MySQL 数据库以获得相同的信息?

例如,假设您有一个 JavaScript 自动完成搜索字段,需要 3,000 个字词进行匹配。使用include 从另一个文件中读取这些术语或使用简单的SELECT 查询从MySQL 数据库中读取它们是否更快?

编辑:这是假设我要包含的数据库和文件与我的代码位于同一本地计算机上。

【问题讨论】:

  • 请注意,读入数据是一回事,但匹配该数据是另一个重要的性能步骤。所以你的问题可能不会邀请你需要的答案。

标签: php mysql performance include


【解决方案1】:

我完全不知道,但是在我使用 MySQL 的意见中,即使可以慢一些,如果内容是动态的,也可以使用。但我敢肯定,对于大内容,使用 include 会更快。

【讨论】:

    【解决方案2】:

    只要文件不是太大并且您最终会使用太多内存,就一定要包括在内,在这种情况下,建议使用数据库

    【讨论】:

      【解决方案3】:

      很难/不可能给出准确的答案,因为未知变量太多 - 如果文件系统安装在位于世界另一端的NFS 上怎么办?或者你在内存中有整个 MySQL 数据库。数据库的大小也应该考虑在内。

      但是,更确切地说,一个安全的猜测是 MySQL 更快,因为它具有良好的索引、良好的数据库结构/规范化以及不太花哨/复杂的查询。 I/O 操作总是很昂贵(读取:慢),而如前所述,整个数据集已经被 MySQL 缓存在内存中。

      此外,我想您想对这些包含的文件进行进一步的字符串操作,这使事情变得更加麻烦 - 我相信 MySQL 的字符串搜索算法比您在 PHP 中提出的优化得更好。

      【讨论】:

        【解决方案4】:

        从文件中将原始数据读入脚本通常比从数据库中更快。

        但是听起来您想查询该数据以找到匹配项以返回到 javascript。在这种情况下,您可能会发现 MySQL 在实际查询/搜索数据时会更快(尤其是在正确索引的情况下等),因为这是数据库擅长的。

        读取大文件的可扩展性也较低,因为在脚本执行时您将使用大量服务器内存。

        【讨论】:

          【解决方案5】:

          这取决于。如果您的文件本地存储在您的服务器中,而数据库安装在另一台机器上,那么包含该文件会更快。

          Buuuuut,因为这取决于您的系统,这可能不是真的。我建议你制作一个 PHP 测试脚本并从命令行运行 100 次,然后通过 HTTP 重复测试(使用 cURL)

          例子:

          use_include.php

          <?php
          
            start = microtime(true);
          
            include( 'somefile.php' );
          
            echo microtime(true)-start;
          
          ?>
          

          use_myphp.php

          <?php
          
            start = microtime(true);
          
            __put_here_your_mysql_statements_to_retrieve_the_file__
          
            echo microtime(true)-start;
          
          ?>
          

          【讨论】:

            【解决方案6】:

            如果这是您要定期获取的内容,则可能值得预取数据(从磁盘或数据库,无关紧要)并让您的脚本从内存缓存(如 memcached)中提取数据.

            【讨论】:

              【解决方案7】:

              时间上的差异更多地取决于系统设计,而不是我敢说的底层技术。 MySQL结果和文件都可以缓存在内存中,性能差异小到可以忽略不计。

              相反,我会问自己在维护方面会有什么不同。你有可能改变数据吗?如果没有,只需将其弹出一个普通文件即可。您是否可能经常更改内容的某些部分?如果是这样,数据库更容易操作。数据的结构也一样,如果需要“重构”,也许放到数据库中效率更高?

              所以:做您认为对您和代码和数据的未来维护者最方便的事情。 :-)

              【讨论】:

                【解决方案8】:

                包含文件应该总是更快。如果您的数据库在另一台机器上(例如在共享主机中)或在多服务器设置中,则查找将不得不进行额外的跳跃。

                但是,在实践中,差异可能并不重要。如果列表是动态的,那么将其存储在 MySQL 中将使您的生活更轻松。静态列表(例如国家或州)可以存储在 PHP 包含中。如果列表很短(几百个条目)并且经常使用,您可以将其直接加载到 JavaScript 中并取消 AJAX。

                如果您正在使用 MySQL 路线并且担心速度,请使用缓存。

                $query = $_GET['query'];
                $key = 'query' . $query;
                if (!$results = apc_fetch($key))
                { 
                    $statement = $db->prepare("SELECT name FROM list WHERE name LIKE :query");
                    $statement->bindValue(':query', "$query%");
                    $statement->execute();
                    $results = $statement->fetchAll();
                    apc_store($key, $results);
                }
                
                echo json_encode($results);
                

                【讨论】:

                • 这是我能想象到的最好的方式。即使文件系统最初更快,您也不会比构建您正在使用的 PDO 驱动程序的人编写更快的文件选择逻辑。
                【解决方案9】:

                为什么不双向进行,看看哪个更快?这两种解决方案都很简单。

                【讨论】:

                  【解决方案10】:

                  如果您预计词条的数量在以后会变大,最好使用带有fulltext search 字段的 MySQL。

                  【讨论】:

                    【解决方案11】:

                    我最近遇到了这个问题。我在 mysql 中有一些数据,我正在查询每个页面请求。对于我的数据集,写固定记录长度的文件比使用 MySQL 快。

                    对我来说,有几个不同的因素使文件比 MySQL 更快:

                    1. 文件很小 -- 文本数据不到 100kb
                    2. 我是随机挑选而不是搜索——索引没有区别
                    3. 连接时间——当服务器负载很高时,打开文件并读入比连接到数据库要快。尤其如此,因为操作系统将文件缓存在内存中

                    底线是我对其进行了基准测试并比较了结果。对于我的工作量,文件系统更快。我怀疑如果我的数据集不断增长,那将会改变。我将密切关注性能,并准备在未来改变它的工作方式。

                    【讨论】:

                      【解决方案12】:

                      如果您使用 APC 或 Xcache 等 PHP 字节码缓存,包含文件可能会更快。如果您使用 PHP 并且想要性能,那么绝对需要字节码缓存。

                      听起来您正在考虑在包含的 PHP 脚本中保留静态数据,以避免访问数据库。你基本上是在做一个基本的缓存。这可以正常工作,只要您有某种方式在数据发生更改时刷新该文件。您可能还想了解 MySQL 查询缓存,以便更快地对静态数据进行 SQL 查询。或者 Memcached 用于将静态数据保存在内存中。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2010-11-29
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-10-14
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多