表单自动填充字段 - 响应缓慢

时间:2014-08-06 17:53:45

标签: atk4

我的表单有一个像这样的自动填充字段

$ f = $ this-> add('Form');
$ F->激活addField( '自动完成', '项目') - > setValueList($这 - > API-> DB-> DSQL() - >表( '项目') - >字段( 'nroitem,CONCAT(nroitem,\' - \ 'detalle)') - > do_getAssoc());

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

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

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

我试过制作一些索引但没有运气。 我已经尝试通过会话变量(setValueList($ array)将数组传递给数据库)。

感谢。

1 个答案:

答案 0 :(得分:0)

  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. 快得多
  6. 理论上,自动填充字段的记录没有限制。一切都取决于你的数据库结构,服务器性能,索引,主要是你自己的代码:)我会说100`000记录仍然可以正常工作。