0

我正在使用类 'chosen-select' 来加载所有产品名称。当用户单击 product_select 时,加载需要很长时间。可以做些什么来提高性能。

<select class='chosen-select' data-placeholder="Choose a product..." id="product_select">
  <option></option>
         <?php
          include 'connection.php';

           $query = "SELECT * FROM " . $table_name;

           $result = mysqli_query($con, $query);

           $results = array();
           while ($line = mysqli_fetch_assoc($result))
           {
                   $results[] = $line;
           }
           $i = 0;
           foreach ($results as $r)
           {
               $i++;
               echo "<option value=" . $r['id'] . ">" . $r['Product_name'] . "</option>";
           }
          ?>
</select>

<script>
     $('#product_select').chosen({max_selected_options: 1});

</script>
4

1 回答 1

2

你应该做什么

一次性提供这么多选项可能不是一个好主意,只是为了您的用户的理智。如果是我,我可能会切换到自动完成模型或用户在请求之前将选项请求缩小到子集的方式,但是,这里有一些关于您可以用来优化的提示。

你可以做什么

您可以优化的唯一真正点——无需自己重写 jQuery 插件——就是改进服务器端的东西。这可能包括(如 Samuel Liew 所述)缓存服务器响应,但也改善您与数据库的连接,即确保您处理的是本地数据库而不是远程数据库。一些有助于加快查询速度的简单步骤:

通过指定目标字段而不是使用*它可能有助于处理大量行。

优化 mysql 查询的 15 个技巧

即使更改数据库/表的类型也会有所帮助——例如,如果您的硬件磁盘写入速度/效率较低,那么请尝试完全从内存中运行您的表。但是,这些类型的选项要求您必须对数据库服务器和数据库配置进行大量控制,如果您使用的是共享主机,则不太可能做很多事情......您可以选择使用 MySQL或者 SQLite,这可能足以在基于磁盘的数据库之间切换到基于内存的数据库。如果您正在运行专用服务器,但是您可以做很多事情来优化 MySQL,但这需要大量阅读(这是一个复杂的主题),这个 SO 线程暗示了您可以为 MySQL 做的一些事情:

最佳 MySQL 配置 (my.cnf)

一件事可能会有所帮助,但取决于您的数据库实例有多少内存,那就是在您的查询中构建您的 HTML。对于复杂的查询,我不建议这样做,但是您生成的内容非常简单。以下假设使用 MySQL:

SELECT 
  GROUP_CONCAT(
    '<option value="',id,'">', name, '</option>' SEPARATOR ''
  ) AS html
  FROM $table_name 
  GROUP BY NULL

一旦数据库将您想要的 HTML 带回 PHP,您可以将此结果缓存到另一个 db 表中,或者作为本地文件系统中的文件;然后在对该选项列表的下一个请求中,您应该从缓存位置提供服务 - 并继续这样做,直到前缀到期时间(或缓存被删除)。

以下链接解释了粗略的过程,根据您的需要,您只需编写从数据库返回的结果;而不是ob_get_contents()像他们的例子那样——但这只是服务器端缓存的一种方式。

php中的简单服务器端缓存

客户端缓存

根据您显示此输入的频率或用户可能遇到它的频率,您还可以使用该window.localStorage对象在客户端(对于支持它的浏览器)进行优化。这将允许您在发出 AJAX 选择请求之前检查 localStorage,如果您已经将选项 html 存储在那里,您可以使用它并完全删除请求。似乎有 5M 的非官方存储限制,localStorage但这应该涵盖您的 50000 个项目。这显然不会加快用户第一次访问的速度,但后续访问应该会有所改善。您还应该记住在更新数据库表时清除缓存的方法。

于 2013-08-26T08:23:22.303 回答