表单自动完成领域-缓慢的反应

  • 本文关键字:缓慢 表单 atk4
  • 更新时间 :
  • 英文 :


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

$f = $this->add('Form');
$ f -> addField("自动完成","项目")-> setValueList ($ this -> api -> db -> dsql()——>表("项目")->字段("nroitem, concat (nroitem ‘-’,detalle)")——> do_getAssoc ());

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

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

这类字段从表中获取的数据大小有限制吗?

我试着做一些索引,但没有运气。我已经尝试通过会话变量传递数组(setValueList($array),我得到与先前的查询数据库)。

谢谢。

  1. 尝试使用最新的ATK版本(至少从4.2开始)。x分行)。

  2. 不要在大数组中使用setValueList !定义模型并使用$field->setModel($model)

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

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

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

最新更新