【发布时间】:2011-09-27 16:20:51
【问题描述】:
我遇到的问题是使用下面的当前函数加载时间太长。正在连接的两个表各包含数千行。保存表连接的特定函数是下面模型部分中的&getFields() 函数。
我在想我可能有一个函数,它最初检查请求是编辑还是添加新请求,然后处理仅在编辑查询上分离表连接(不知道如何完成此操作)。
从页面初始页面调用 - 使用带有 post 方法的 html 表单
控制器将流量导向模型
拥有实际功能的模型
#__directory_enf as ef on (f.id = ef.field_id and ef.entry_id = '.$this->_id.')其中
f.published = 1 order by f.ordering asc'; $this->_db->setQuery( $query ); $fields = $this->_db->loadObjectList(); $session =& JFactory::getSession(); if($session->has('post') 和 !$this->_id) { $post = $session->get('post'); for($i=0;$ifield_value = isset($post['field_'.$fields[$i]->name])?$post['field_'.$fields[$i]->name]:null ; } 返回$字段; } 函数存储(){ // 检查请求伪造 JRequest::checkToken() 或 jexit( JText::_('Invalid Token') ); $post = JRequest::get('post'); $session =& JFactory::getSession(); $session->set('post', $post); if($post["title"] == "") return JText::_('请输入标题'); $query = 'select * from #__directory_field where published = 1'; $this->_db->setQuery( $query ); $fields = $this->_db->loadObjectList(); for($i=0;$irequired 和 $post['field_'.$fields[$i]->name] == "") return JText::_($fields[$i]->title . '是必填字段,不能留空。'); } if(!$post["id"]) { $date =& JFactory::getDate(); $post['create_date'] = $date->toMySQL(); $post['排序'] = 1; $query = '从#__directory_entry order by ordering desc limit 1中选择排序'; $this->_db->setQuery( $query ); $post['ordering'] += $this->_db->loadResult(); $post['已发布'] = 1; } $me =& JFactory::getUser(); JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomd'.DS.'tables'); $row =& JTable::getInstance('entry', 'Table'); if (!$row->bind($post)) return JText::_('对不起,发生了一些错误。'); if (!$row->store()) 返回 $this->_db->getErrorMsg(); if(!$post['id']) { $post['id'] = $this->_db->insertid(); JRequest::setVar('id', $post['id']); $msg = JText::_('条目添加成功!'); $query = '插入#__directory_enu (entry_id, user_id) 值('.$post['id'].', '.$me->id.')'; $this->_db->setQuery( $query ); $this->_db->query(); } 别的 $msg = JText::_('条目更新成功!'); $max_size = 10000000; jimport('joomla.filesystem.file'); $时间=时间(); for($i=0;$itype == "图像") $allowed = array('.jpg', '.jpeg', '.gif', '.png'); elseif($field->type == "文件") $allowed = array('.doc', '.docx', '.pdf', '.txt', '.exl', '.xls', '.xlsx', '.jpg', '.jpeg', '.gif', '.png', '.zip'); $标志=真; $query = 'select count(*) from #__directory_enf where entry_id = '。 $post["id"] 。和 field_id = ' 。 $field->id; $this->_db->setQuery( $query ); $count = $this->_db->loadResult(); if($field->type == "image" 或 $field->type == "file") { $image = JRequest::getVar("field_".$field->name, null, 'FILES', 'array'); $image_name = str_replace(' ', '', JFile::makeSafe($image['name'])); $image_tmp = $image["tmp_name"]; 如果($图像名称“”){ $ext = strrchr($image_name, '.'); if(!in_array($ext, $allowed)) return sprintf(JText::_('%s 的文件类型不允许。'), $field->title); 如果(文件大小($image_tmp)> $max_size) return sprintf(JText::_('%s 的文件大小超过了最大文件大小。'), $field->title); if(move_uploaded_file($image_tmp, JPATH_SITE.'/files/'.$time.$image_name)) $post["field_".$field->name] = $time.$image_name; 别的 return sprintf(JText::_('抱歉,无法上传 %s 的文件。'), $field->title); } 别的 $标志=假; } 如果($标志){ 如果($计数){ $query = '从 #__directory_enf 中选择 id,其中 entry_id = '.$post["id"].'和 field_id = ' 。 $field->id; $this->_db->setQuery( $query ); $field_id = $this->_db->loadResult(); $update = 新的 stdClass(); $update->id = $field_id; $update->field_value = $post["field_".$field->name]; $this->_db->updateObject('#__directory_enf', $update, 'id'); } 别的 { $插入 = 新标准类(); $插入->id = null; $插入->field_id = $field->id; $insert->entry_id = $post["id"]; $insert->field_value = $post["field_".$field->name]; $this->_db->insertObject('#__directory_enf', $insert, 'id'); } } } $session->clear('post'); 返回$味精; }
【问题讨论】:
-
也许您可以尝试将问题缩小到比“这里有几百行代码,修复它”更具体的问题。如果您有正确的索引,在 MySQL 中连接数百万行的表会很快 - 数千行不应该是任何麻烦。
-
您是否在 ON 子句中的键上使用索引?
-
PHP 或任何其他应用程序语言永远无法像 SQL 一样进行扩展(1K、10K、100K 等记录)。
-
放置大量代码的原因是为了提供尽可能多的信息。主要问题在于 &getFields()。根据我的研究,处理速度慢的可能原因是表连接。一位消息人士解释说,连接 2 个表不仅会使处理压力增加一倍,而且会大大增加。
-
除了索引您要连接的字段之外,我还建议您只选择您需要的字段。尽量避免 f.*