Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 来自joomla的Mysql查询需要很长时间_Php_Mysql_Joomla - Fatal编程技术网

Php 来自joomla的Mysql查询需要很长时间

Php 来自joomla的Mysql查询需要很长时间,php,mysql,joomla,Php,Mysql,Joomla,对不起,这个问题。我不是一个好的程序员 执行得很好,菜单项很少。但有14K个菜单项。我坚持这个问题。这是在我尝试访问时发生的 administrator/index.php?option=com\u modules&view=module&layout=edit&id=97 有没有办法改变查询 质疑 /> 您只需删除连接即可。我很确定加入对你的查询绝对没有影响,而且会快得多。您可以尝试直接在数据库中运行查询(有连接和没有连接),以验证结果是否相同 我不确定这个连接的目的是什么,但我想这是

对不起,这个问题。我不是一个好的程序员

执行得很好,菜单项很少。但有14K个菜单项。我坚持这个问题。这是在我尝试访问时发生的

administrator/index.php?option=com\u modules&view=module&layout=edit&id=97
有没有办法改变查询

质疑


  • />
    您只需删除连接即可。我很确定加入对你的查询绝对没有影响,而且会快得多。您可以尝试直接在数据库中运行查询(有连接和没有连接),以验证结果是否相同

    我不确定这个连接的目的是什么,但我想这是程序员试图实现的一些功能的残余,但实现方式不同或被放弃,留下了一个无用的连接

    这种层次表的结构是这样的,以防止此类连接。您有一个lft和一个rgt值,lft和rgt之间的任何项都是子项。此外,还有一个级别值,告诉您值在树中的深度。因此,要选择项目的所有子项,可以执行以下操作:

    select * where lft>item.lft and rgt>item.rgt
    
    要仅选择项目的直接后代,请执行以下操作:

    select * where lft>item.lft and rgt>item.rgt and level=item.level+1
    
    数据库中的结构有点难以维护,需要特殊的函数来更新数据,但搜索和提取数据很快

    因此,getMenuLinks()函数的开头应该是

    public static function getMenuLinks($menuType = null, $parentId = 0,
      $mode = 0, $published = array(), $languages = array())
    {
      $db = JFactory::getDbo();
      $query = $db->getQuery(true)
        ->select('a.id AS value, a.title AS text, a.alias, a.level,
          a.menutype, a.type, a.template_style_id, a.checked_out')
        ->from('#__menu AS a');
    
      // Filter by the type
      if ($menuType) 
      ...
    

    添加explain和post,以及左侧的schemaThat,使用>和<进行连接将非常缓慢。我们真的不知道你的数据里有什么或者你想做什么,但是你必须简化这个连接。
    public static function getMenuLinks($menuType = null, $parentId = 0, $mode = 0, $published = array(), $languages = array())
    {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true)
            ->select('a.id AS value, a.title AS text, a.alias, a.level, a.menutype, a.type, a.template_style_id, a.checked_out')
            ->from('#__menu AS a')
            ->join('LEFT', $db->quoteName('#__menu') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt');
    
        // Filter by the type
        if ($menuType)
        {
            $query->where('(a.menutype = ' . $db->quote($menuType) . ' OR a.parent_id = 0)');
        }
    
        if ($parentId)
        {
            if ($mode == 2)
            {
                // Prevent the parent and children from showing.
                $query->join('LEFT', '#__menu AS p ON p.id = ' . (int) $parentId)
                    ->where('(a.lft <= p.lft OR a.rgt >= p.rgt)');
            }
        }
    
        if (!empty($languages))
        {
            if (is_array($languages))
            {
                $languages = '(' . implode(',', array_map(array($db, 'quote'), $languages)) . ')';
            }
    
            $query->where('a.language IN ' . $languages);
        }
    
        if (!empty($published))
        {
            if (is_array($published))
            {
                $published = '(' . implode(',', $published) . ')';
            }
    
            $query->where('a.published IN ' . $published);
        }
    
        $query->where('a.published != -2')
            ->group('a.id, a.title, a.alias, a.level, a.menutype, a.type, a.template_style_id, a.checked_out, a.lft')
            ->order('a.lft ASC');
    
        // Get the options.
        $db->setQuery($query);
    
        try
        {
            $links = $db->loadObjectList();
        }
        catch (RuntimeException $e)
        {
            JError::raiseWarning(500, $e->getMessage());
    
            return false;
        }
    
        if (empty($menuType))
        {
            // If the menutype is empty, group the items by menutype.
            $query->clear()
                ->select('*')
                ->from('#__menu_types')
                ->where('menutype <> ' . $db->quote(''))
                ->order('title, menutype');
            $db->setQuery($query);
    
            try
            {
                $menuTypes = $db->loadObjectList();
            }
            catch (RuntimeException $e)
            {
                JError::raiseWarning(500, $e->getMessage());
    
                return false;
            }
    
            // Create a reverse lookup and aggregate the links.
            $rlu = array();
    
            foreach ($menuTypes as &$type)
            {
                $rlu[$type->menutype] = & $type;
                $type->links = array();
            }
    
            // Loop through the list of menu links.
            foreach ($links as &$link)
            {
                if (isset($rlu[$link->menutype]))
                {
                    $rlu[$link->menutype]->links[] = & $link;
    
                    // Cleanup garbage.
                    unset($link->menutype);
                }
            }
    
            return $menuTypes;
        }
        else
        {
            return $links;
        }
    
    select * where lft>item.lft and rgt>item.rgt
    
    select * where lft>item.lft and rgt>item.rgt and level=item.level+1
    
    public static function getMenuLinks($menuType = null, $parentId = 0,
      $mode = 0, $published = array(), $languages = array())
    {
      $db = JFactory::getDbo();
      $query = $db->getQuery(true)
        ->select('a.id AS value, a.title AS text, a.alias, a.level,
          a.menutype, a.type, a.template_style_id, a.checked_out')
        ->from('#__menu AS a');
    
      // Filter by the type
      if ($menuType) 
      ...