MySQL:嵌套集很慢?

2023-11-29

我有一个看起来像这样的表:

category

  • 类别_id
  • name
  • 类别 seo 友好 url
  • left_id
  • right_id

当我运行这样的查询时,大约需要1秒:

SELECT node.category_id                                       AS node_category_id,
       node.category_seo_friendly_url,
       node.name,
       ( COUNT(parent.category_id) - ( sub_tree.depth + 1 ) ) AS depth
FROM   category AS node,
       category AS parent,
       category AS sub_parent,
       (SELECT node.category_id,
               ( COUNT(parent.category_id) - 1 ) AS depth
        FROM   category AS node,
               category AS parent
        WHERE  node.left_id BETWEEN parent.left_id AND parent.right_id
               AND node.category_id = 2
        GROUP  BY node.category_id
        ORDER  BY node.left_id)AS sub_tree
WHERE  node.left_id BETWEEN parent.left_id AND parent.right_id
       AND node.left_id BETWEEN sub_parent.left_id AND sub_parent.right_id
       AND sub_parent.category_id = sub_tree.category_id
GROUP  BY node.category_id
HAVING depth > 0
       AND depth <= 1
ORDER  BY node.name ASC

当我做一个EXPLAIN,我得到以下信息:

id    select_type    table       type    possible_keys                         key       key_len    ref     rows    Extra
1     PRIMARY        <derived2>  system  NULL                                  NULL      NULL       NULL    1       Using temporary; Using filesort
1     PRIMARY        sub_parent  const   PRIMARY,category_id,left_id,right_id  PRIMARY   4          const   1     
1     PRIMARY        node        ALL     left_id                               NULL      NULL       NULL    748     Using where
1     PRIMARY        parent      ALL     left_id,right_id                      NULL      NULL       NULL    748     Range checked for each record (index map: 0x30)
2     DERIVED        node        const   PRIMARY,category_id,left_id           PRIMARY   4                  1     
2     DERIVED        parent      range   left_id,right_id                      left_id   5          NULL    17      Using where

知道发生了什么事吗?我无法承受这近 1 秒的执行时间。

UPDATE:

-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 16, 2011 at 10:58 PM
-- Server version: 5.0.91
-- PHP Version: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `foobar`
--
-- --------------------------------------------------------
--
-- Table structure for table `category`
--
CREATE TABLE IF NOT EXISTS `category`
  (
     `category_id`               INT(11) NOT NULL AUTO_INCREMENT,
     `name`                      CHAR(255) DEFAULT NULL,
     `category_seo_friendly_url` CHAR(255) DEFAULT NULL,
     `left_id`                   INT(11) DEFAULT '1',
     `right_id`                  INT(11) DEFAULT '2',
     PRIMARY KEY (`category_id`),
     UNIQUE KEY `seo_friendly_url_UNIQUE` (`category_seo_friendly_url`),
     KEY `category_id` (`category_id`),
     KEY `left_id` (`left_id`),
     KEY `right_id` (`right_id`)
  )
ENGINE=MyISAM
DEFAULT CHARSET=latin1
AUTO_INCREMENT=765; 

IME、MySQL 在优化子查询方面表现不佳 - 特别是它似乎无法管理推送谓词。

我对查询实际要返回的内容有点困惑 - 特别是“子父级”

通过将 left_id 和 right_id 放入单个索引中,您会得到一些改进。

虽然您还可以通过将查询展开到存储过程中来获得一些改进,但考虑到您似乎每次都会遍历几乎整个数据集,更好的解决方案是对树深度进行非规范化并将其存储为每个节点的属性。事实上,您似乎仅在外部查询中就至少遍历了两次。

但是我注意到在查询结束时:

HAVING depth > 0
   AND depth <= 1

这肯定是同一件事

HAVING depth=1

然后,它提供了一种非常不同的优化查询的方法(首先获取 right=left+1 的所有节点来查找没有子节点的节点,然后逐步检查类别 id)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:嵌套集很慢? 的相关文章

  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 按 MAX(time) WHERE time <= x 选择最近的 MySQL 行

    我正在选择 MySQL 表的最新条目 SELECT MAX time as most recent userID FROM TableName GROUP BY userID ORDER BY most recent DESC 我的问题是
  • 为 Mariadb 安装连接器 C

    所以 我想使用 Mariadb 有一个连接器 C https downloads mariadb org connector c https downloads mariadb org connector c 我该如何安装它 坦白说 它的文
  • PHP 中的异步数据库/服务调用:Gearman 与 pthreads

    在我们的 LAMP 站点上 我们遇到一些服务必须多次调用数据库才能提取数据的问题 通常在 PHP 中完成此操作的方式 至少我的经验 是串行的 这显然是低效的 我们可以通过使用缓存和聚合一些查询来缓解一些低效率的问题 但在某些情况下我们仍然需
  • 使用 EXPLAIN 进行 MYSQL 存储过程调用

    如何分析和使用 EXPLAIN 来调用我的存储过程 我需要优化查询时间 但是似乎没有地方可以执行 EXPLAIN 调用 proc name 你可以试试 set profiling 1 call proc name show profiles
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 我可以在一个查询中更新/选择表吗?

    我需要在查看页面时选择数据并更新 视图 列 有没有一种方法可以在一个查询中执行此操作 或者我是否必须使用不同的查询 如果您不想 不需要使用事务 则可以创建一个存储过程 该过程首先更新视图计数 然后选择值并将其返回给用户
  • 哪个是识别关系或非识别关系中的子表?

    在表之间的识别和非识别关系的上下文中 MySQL 文档大量将表称为父表和子表 如何判断哪个表是父表 哪个表是子表 子表 A K A 弱实体 http en wikipedia org wiki Weak entity 是一个表 其主键属性d

随机推荐

  • 克利夫兰心脏病数据集 - 无法描述类别

    我正在使用来自 UCI 的克利夫兰心脏病数据集用于分类 但我不明白target属性 数据集描述说值从 0 到 4 但属性描述说 0 1 gt 50 冠状动脉疾病 我想知道如何解释这个问题 这个数据集是多类还是二元分类问题 我必须将值 1 4
  • 我们是否同步最终的实例变量?如果是的话有什么用?

    我想知道我们是否同步最终的实例变量 由于变量是最终变量 因此值不能更改 有人能解释一下吗 我们是否同步最终的实例变量 是的 您仍然需要同步可变对象 最终 不可变 public class Something private final Li
  • 在没有远程服务器的情况下使用 Git 进行协作

    我正在和另外两个朋友一起做一个学校项目 我想要一种简单的方法来管理源代码控制 因此我尝试了 Git 虽然 Git 看起来很棒 有版本控制之类的东西 我如何与我的队友分享 我看过有关在远程服务器上共享的文章 但是 我可以只在我的计算机上设置
  • 无法使用变量设置变量长度

    我现在想做的是创建一个长度由变量定义的数组 但是 当我将变量放入数组长度时 它给出了 非 POD 元素类型 glm vec2 的可变长度数组 错误 但是 如果我用实际数字替换变量 错误就会消失 为什么会发生这种情况以及如何解决这个问题 in
  • 如何将完整的 RazorPage 渲染为字符串?

    我尝试使用来自的解决方案https stackoverflow com a 54043063 234954 将页面渲染为字符串 这样我可以将其转换为 PDF 但这只能让我获得主视图 它不会获得与页面关联的布局 因此它缺少样式表和一些页眉 页
  • 如何在 R 中手动创建和加载命名空间 [重复]

    这个问题在这里已经有答案了 是否可以手动创建并加载命名空间环境foo 没有做出实际的foo包 这样我们就可以使用双冒号运算符foo test访问该环境中的对象 The attach函数将列表或环境附加到搜索路径 foo lt list te
  • 如何在 Python 中将不同的进程固定到各个 cpu 核心

    我正在编写一个 Python 程序 它将从文本文件加载单词列表 然后尝试用每个单词解压缩存档 如果不利用所有 cpu 核心的话 问题并不严重 由于 GIL 如果我没记错的话 Python 中的线程并不是一个很好的选择 所以我想获取cpu c
  • 创建应用程序/产品配置的设计模式/指南

    我想知道是否有任何设计模式 指南或记录的widsom 最佳实践来创建 应用程序配置 结构 数据和文件 我意识到这个问题在一些帖子中已经部分涉及 但我希望以下问题能够促使人们从另一个方面看待这个主题 基本上 创建配置结构需要进行什么样的分析
  • Postgres 更新列数据时出错

    尝试在表上运行更新脚本 但出现错误 错误 ok 列不存在 第 2 行 设置first name ok last name pk 电子邮件 ooo 电话 CREATE TABLE employee employee id SERIAL PRI
  • 验证码 + RequireJS

    如何使用 requirejs 导入 recaptcha 我已经尝试了几件事 但没有任何效果 我需要这样做 以便能够在加载后使用 reCaptcha 的渲染方法自行渲染它 require config paths recaptcha http
  • 警告您的 Apk 正在使用需要隐私策略的权限:(android.permission.READ_PHONE_STATE)

    在清单中未添加 android permission READ PHONE STATE 允许 为什么当我上传新的 apk 版本时出现错误 如下所示 您的应用有一个版本代码为 1 的 apk 该 apk 请求以下权限 android perm
  • 以编程方式在 TFS 中添加新迭代

    我可以通过右键单击项目并转到 团队项目设置 gt 区域和迭代 gt 迭代 选项卡 手动将新迭代添加到 TFS 中的团队项目 是否有一个示例说明如何使用他们的 API 以编程方式执行此操作 Thanks 经过基于 taylonr 链接的一些实
  • as_list() 未在 y_t_rank = len(y_t.shape.as_list()) 上的未知 TensorShape 上定义且与指标相关

    TF 2 3 0 dev20200620 对于具有 sigmoid 二进制输出的模型 我在 fit 期间遇到此错误 我使用 tf data Dataset 作为输入管道 奇怪的是它取决于指标 不工作 model compile optimi
  • JPA。 Stackoverflow 上的级联合并

    这是我的 JPA 结构 电影 查看级联类型 Entity Table name movie public class Movie Id Column name movie id GeneratedValue strategy Generat
  • 关闭 Mac Objective C

    我需要能够实现以下方法 Shutdown Restart Logoff Sleep 在 Mac 上 我使用 XCode 但似乎无法找出执行这些操作的代码 有人可以帮我从这里出去吗 Thanks 一个简单 懒惰的方法是通过一些简单的内联App
  • 如何在 firestore 9 中将具有自定义 ID 的文档添加到 firestore

    如何将自定义 id 添加到 firestore 文档而不是由 firebase 9 自动生成的 id 我在将此代码转换为 firebase 9 版本时遇到问题 db collection cities doc LA set name Los
  • 成员名称不能与其在 g.cs 文件中的封闭类型相同

    我已经在 StackOverflow 中搜索过此问题的解决方案 但显然这次有所不同 在我的 Windows Phone 应用程序中 当用户按下特定按钮时 应用程序应将他重定向到特定的全景页面 因此我按照以下步骤操作 http blogs m
  • 如何使用java中的for循环从类创建新对象?

    我有一个名为 Card 的类 并且有这个 for 循环 int i for i 0 i lt 13 i Card cardNameHere new Card 我想做的是基于 for 循环创建新实例 例如 我希望名称为 card1 card2
  • Apache Kafka 中 Producer.properties 和 Consumer.properties 文件的使用

    Kafka 包内有一个 config 文件夹 其中包含各种配置文件 该文件夹包含 Consumer properties 和 Producer properties 文件 这些配置是在我们运行 Kafka 集群以及我们的代码连接到 kafk
  • MySQL:嵌套集很慢?

    我有一个看起来像这样的表 category 类别 id name 类别 seo 友好 url left id right id 当我运行这样的查询时 大约需要1秒 SELECT node category id AS node catego