我的表单有一个像这样的自动填充字段
$ f = $ this-> add('Form');
$ F->激活addField( '自动完成', '项目') - > setValueList($这 - > API-> DB-> DSQL() - >表( '项目') - >字段( 'nroitem,CONCAT(nroitem,\' - \ 'detalle)') - > do_getAssoc());
当我测试表单时,自动完成字段的响应非常慢(3-4秒带来表的信息,并且屏幕被冻结。),同样当我删除第一个字段时搜索范围。
concat是允许按项目编号或项目名称进行搜索。
从表中获取的数据大小是否有这种字段的限制?
我试过制作一些索引但没有运气。 我已经尝试通过会话变量(setValueList($ array)将数组传递给数据库)。
感谢。
答案 0 :(得分:0)
尝试使用最新的ATK版本(至少从4.2.x分支开始)。
不要将setValueList
用于大数组!定义模型并改为使用$field->setModel($model)
。
PHP基本上很慢,因为你解析了数组中的所有记录,然后将这个数组设置为自动完成字段的数据源。如果有很多记录,那将消耗大量的处理时间和RAM。
SQL很慢,因为您不是在未修改的表字段中搜索,而是在串联中搜索。这意味着,MySQL不能使用任何优化,它应该连接表的所有记录的这些值,然后才开始评估WHERE。这就是说WHERE nroitem LIKE '%abc%' OR detalle LIKE '%abc%'
的工作速度应该比WHERE concat(nroitem,'-',detalle) LIKE '%abc%'
理论上,自动填充字段的记录没有限制。一切都取决于你的数据库结构,服务器性能,索引,主要是你自己的代码:)我会说100`000记录仍然可以正常工作。