【问题标题】:Form autocomplete field - slow response表单自动完成字段 - 响应缓慢
【发布时间】:2014-08-12 22:41:35
【问题描述】:

我有一个像这样的自动完成字段的表单

$f = $this->add('Form');
$f->addField('autocomplete','item')->setValueList($this->api->db->dsql()->table('item')->field('nroitem,concat(nroitem, \'-\',detelle)')->do_getAssoc());

当我测试表单时,自动完成字段的响应非常慢(3-4秒带入表格信息,屏幕被冻结。),当我删除第一个字段做a时也是如此搜索。

concat 是允许按项目编号或项目名称搜索。

这种字段从表中获取的数据大小是否有限制?

我尝试过制作一些索引,但没有成功。 我尝试通过会话变量(setValueList($array) 传递数组,这是我通过对数据库的先前查询获得的)。

谢谢。

【问题讨论】:

  • 您使用的是哪个版本的 ATK 和 Autocomplete 插件?您的item 表中有多少条记录?索引不会以任何方式帮助您,因为 SQL 使用 `LIKE '%searchstring%' 类型的比较。
  • 并且不要将 setValueList 用于大数组!定义模型并使用 $field->setModel($model) 代替。
  • 我使用的是 4.1 pf ATK 版本。我知道有点老了,而且我没有使用模型。我将尝试使用模型。
  • 是的,4.1 已经很老了。 4.2 还可以,4.3(很多东西都变了)很快就会发布 :)
  • PHP 比较慢主要是因为解析数组中的所有记录,然后将此数组设置为自动完成字段的数据源。如果有很多记录,则会消耗大量的处理时间和 RAM。

标签: atk4


【解决方案1】:
  1. 尝试使用最新的 ATK 版本(至少来自 4.2.x 分支)。

  2. 不要将setValueList 用于大型数组!定义模型并改用$field->setModel($model)

  3. 在 PHP 中它很慢,主要是因为您解析数组中的所有记录,然后将此数组设置为自动完成字段的数据源。如果有很多记录,则会消耗大量的处理时间和 RAM。

  4. 在 SQL 中它很慢,因为您不是在未修改的表字段中搜索,而是在串联中搜索。这意味着,MySQL 不能使用任何优化,它应该为表的所有记录连接这些值,然后才开始评估 WHERE。也就是说WHERE nroitem LIKE '%abc%' OR detalle LIKE '%abc%' 应该比WHERE concat(nroitem,'-',detalle) LIKE '%abc%' 工作得快很多

  5. 理论上,自动完成字段的记录数没有限制。这一切都取决于您的数据库结构、服务器性能、索引,并且主要取决于您自己的代码:) 我会说 100`000 条记录应该仍然可以正常工作。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多