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