我有一个表单,它有一个像这样的自动完成字段
$f = $this->add('Form');
$ f -> addField("自动完成","项目")-> setValueList ($ this -> api -> db -> dsql()——>表("项目")->字段("nroitem, concat (nroitem ‘-’,detalle)")——> do_getAssoc ());
当我测试表单时,自动完成字段的响应非常慢(3-4秒带来表的信息,并且屏幕冻结),当我删除第一个字段进行搜索时也是如此。
concat允许按项目编号或项目名称进行搜索。
这类字段从表中获取的数据大小有限制吗?
我试着做一些索引,但没有运气。我已经尝试通过会话变量传递数组(setValueList($array),我得到与先前的查询数据库)。
谢谢。
-
尝试使用最新的ATK版本(至少从4.2开始)。x分行)。
-
不要在大数组中使用
setValueList
!定义模型并使用$field->setModel($model)
-
它在PHP中很慢,因为你解析数组中的所有记录,然后将该数组设置为自动完成字段的数据源。如果有很多记录,将会消耗大量的处理时间和内存。
-
它在SQL中很慢,因为您不是在未修改的表字段中搜索,而是在串联中搜索。这意味着,MySQL不能使用任何优化,它应该将表的所有记录的这些值连接起来,然后才开始计算WHERE。也就是说,
WHERE nroitem LIKE '%abc%' OR detalle LIKE '%abc%'
应该比WHERE concat(nroitem,'-',detalle) LIKE '%abc%'
快得多 -
理论上自动完成字段的记录没有限制。这一切都取决于你的数据库结构,服务器性能,索引,主要是你自己的代码:)我想说10万条记录应该仍然可以正常工作。