MySQL Inner Join 有限制吗?

2023-12-01

我有这个查询来收集有关单个订单的信息,它变得非常复杂。

我没有任何数据可以测试,所以我问,如果有人在小型和大型数据集中有这方面的经验,那么您可以或应该在单个查询中进行多少个连接是否有限制?将大型查询分成较小的部分是否明智,或者这不会产生重大影响?

另外,拥有一个合法的WHERE每个之后的子句INNER JOIN?

谢谢你的建议。

这是查询:

# Order: Get Order

function getOrder($order_id) {
    $sql = "SELECT (order.id, order.created, o_status.status,
                    /* payment info */
                    order.total, p_status.status,
                    /* ordered by */
                    cust_title.title, cust.forename, cust.surname,
                    customer.phone, customer.email,
                    cust.door_name, cust.street1,
                    cust.street2, cust.town,
                    cust.city, cust.postcode,
                    /* deliver to */
                    recip_title.title, recipient.forename, recipient.surname,
                    recipient.door_name, recipient.street1,
                    recipient.street2, recipient.town,
                    recipient.city, recipient.postcode,
                    /* deliver info */
                        shipping.name, order.memo,
                    /* meta data */
                    order.last_update)
              FROM tbl_order AS order

        INNER JOIN tbl_order_st AS o_status
                ON order.order_status_id = o_status.id

        INNER JOIN tbl_payment_st AS p_status
                ON order.payment_status_id = p_status.id

        INNER JOIN (SELECT (cust_title.title, cust.forename, cust.surname,
                            customer.phone, customer.email,
        /* ordered by */    cust.door_name, cust.street1,
                            cust.street2, cust.town,
                            cust.city, cust.postcode)
                      FROM tbl_customer AS customer
                INNER JOIN tbl_contact AS cust
                          ON customer.contact_id = cust.id
                INNER JOIN tbl_contact_title AS cust_title
                        ON cust.contact_title_id = cust_title.id
                     WHERE order.customer_id = customer.id)
                ON order.customer_id = customer.id

        INNER JOIN (SELECT (recip_title.title, recipient.forename, recipient.surname,
        /* deliver to */    recipient.door_name, recipient.street1,
                            recipient.street2, recipient.town,
                            recipient.city, recipient.postcode)
                      FROM tbl_contact AS recipient
                INNER JOIN tbl_contact_title AS recip_title
                        ON recipient.contact_title_id = recip_title.id
                     WHERE order.contact_id = recipient.id)
                ON order.contact_id = recipient.id

        INNER JOIN tbl_shipping_opt AS shipping
                ON order.shipping_option_id = shipping.id

             WHERE order.id = '?';";
    dbQuery($sql, array((int)$order_id));
    $rows = dbRowsAffected();
    if ($rows == 1)
        return dbFetchAll();
    else
        return null;
}

由于有人请求此查询的架构,因此它是:

# TBL_CONTACT_TITLE

DROP TABLE IF EXISTS tbl_contact_title;
CREATE TABLE tbl_contact_title(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    title CHAR(3)
) ENGINE = InnoDB;
INSERT INTO tbl_contact_title
    (title)
VALUES  ('MR'),
    ('MRS'),
    ('MS');


# TBL_CONTACT

DROP TABLE IF EXISTS tbl_contact;
CREATE TABLE tbl_contact(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    contact_title_id INT,
    FOREIGN KEY(contact_title_id) REFERENCES tbl_contact_title(id) ON DELETE SET NULL,
    forename VARCHAR(50),
    surname VARCHAR(50),
    door_name VARCHAR(25),
    street1 VARCHAR(40),
    street2 VARCHAR(40),
    town VARCHAR(40),
    city VARCHAR(40),
    postcode VARCHAR(10),
    currency_id INT,
    FOREIGN KEY(currency_id) REFERENCES tbl_currency(id) ON DELETE SET NULL
) ENGINE = InnoDB;

# TBL_CUSTOMER

DROP TABLE IF EXISTS tbl_customer;
CREATE TABLE tbl_customer(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    contact_id INT,
    FOREIGN KEY(contact_id) REFERENCES tbl_contact(id) ON DELETE SET NULL,
    birthday DATE,
    is_male TINYINT,
    phone VARCHAR(20),
    email VARCHAR(50) NOT NULL
) ENGINE = InnoDB, AUTO_INCREMENT = 1000;

# TBL_ORDER_ST

DROP TABLE IF EXISTS tbl_order_st;
CREATE TABLE tbl_order_st(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    status VARCHAR(25)
) ENGINE = InnoDB;
INSERT INTO tbl_order_st
    (status)
VALUES
    ('NEW'),
    ('PROCESSING'),
    ('SHIPPED'),
    ('COMPLETED'),
    ('CANCELLED');


# TBL_SHIPPING_OPT

DROP TABLE IF EXISTS tbl_shipping_opt;
CREATE TABLE tbl_shipping_opt(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    name VARCHAR(50),
    description VARCHAR(255),
    cost DECIMAL(6,3)
) ENGINE = InnoDB;
INSERT INTO tbl_shipping_opt
    (name, description, cost)
VALUES
    ('UK Premier', 'U.K. Mainland upto 30KG, Next Working Day', 8.00),
    ('Europe Standard', 'Most European Destinations* upto 30KG, 2 to 5 Working Days *please check before purchase', 15.00);


# TBL_PAYMENT_ST

DROP TABLE IF EXISTS tbl_payment_st;
CREATE TABLE tbl_payment_st(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    status VARCHAR(25)
) ENGINE = InnoDB;
INSERT INTO tbl_payment_st
    (status)
VALUES
    ('UNPAID'),
    ('PAID');


# TBL_ORDER

DROP TABLE IF EXISTS tbl_order;
CREATE TABLE tbl_order(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    customer_id INT,
        FOREIGN KEY(customer_id) REFERENCES tbl_customer(id) ON DELETE SET NULL,
    contact_id INT,
    FOREIGN KEY(contact_id) REFERENCES tbl_contact(id) ON DELETE SET NULL,
    created DATETIME,
    last_update TIMESTAMP,
    memo VARCHAR(255),
    order_status_id INT,
    FOREIGN KEY(order_status_id) REFERENCES tbl_order_st(id),
    shipping_option_id INT,
    FOREIGN KEY(shipping_option_id) REFERENCES tbl_shipping_opt(id),
    coupon_id INT,
    FOREIGN KEY(coupon_id) REFERENCES tbl_coupon(id) ON DELETE SET NULL,
    total DECIMAL(9,3),
    payment_status_id INT,
    FOREIGN KEY(payment_status_id) REFERENCES tbl_payment_st(id)
) ENGINE = InnoDB, AUTO_INCREMENT = 1000;

MySQL 的 JOIN 数几乎没有任何限制。你的加入人数还不错。但是,由于派生表没有索引,因此您所做的连接派生表(您的内部子查询)可能会导致性能问题。在没有索引的派生表上执行联接可能会很慢。

您应该考虑制作一个带有用于连接的索引的真正临时表,或者找出一种避免子查询的方法。

MySQL 中的 JOIN 基本上就像对每个连接行进行查找(查找)。因此,如果您要连接许多记录,MySQL 将必须执行许多查找。问题不在于您连接的表数量,而在于您连接的行数。

无论如何,MySQL 在放弃并读取整个表之前只会执行这么多次查找。它在决定哪个更便宜方面做得非常好。

也许您能做的最好的事情就是通过使用 ANALYZE TABLE 更新索引统计信息来帮助它猜测。

每个 SELECT 可以有一个 WHERE 子句。因此,您的内部子查询将有一个 WHERE 子句,您的外部查询将有一个 WHERE 子句,这些子查询将在 JOIN 之后应用(至少在逻辑上是这样,尽管 MySQL 通常会首先应用它们以提高性能)。

此外,所有这些都假设您知道如何正确使用索引。

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

MySQL Inner Join 有限制吗? 的相关文章

  • 从 android 发送查询到数据库

    我在 Android 上有一个体育运动列表视图 有没有办法将带有所选选项的 MySQL 查询发送到remote同一张表中包含有关该运动的更多信息的数据库 就像 从桌子上选择足球 提前致谢 扎克 Android 的常见数据库类型是 sqlit
  • Cakephp 在 Bluehost 上安装

    如何设置 Cakephp 才能在 Bluehost 上正常工作 我应该将我的应用程序 cake 和供应商文件夹以及 htaccess 和 index php 文件放在 public html 目录中吗 我按照这里的说明进行操作 http b
  • fputcsv 和记事本

    我使用 fputcsv 生成 csv 文件 它工作得很好 但是当我在记事本 Windows 中查看 csv 文件时 没有新行 所有行都在 1 行中 并且在应该换行的地方有一个正方形 损坏的字符 例如 Mac 上的其他编辑器可以正确显示带有中
  • 文件再次获取内容不起作用替代方案

    我尝试了curl 因为file get contents在php中不起作用 任何人都可以给我解决方案 所以使用curl解决它 这里是代码 userData json decode file get contents https graph
  • PHP如何找到Web服务器的临时路径?

    当您处理 HTTP 上传时 文件将上传到 FILES field name tmp name 我知道我可以从那里提取临时路径 但我期待着也许 SERVER具有临时路径 没有 或其他优雅的方式来了解它的参数 有没有 ini get uploa
  • WordPress Loop:如何将每 3 个帖子包装到一个 div 中?

    我正在尝试这个 div div 但这不起作用 谢谢你 感谢各位的支持 我尝试了两种解决方案 但都不起作用 我最终做到了这
  • Laravel中间件获取路由参数

    我正在编写诸如 学校俱乐部管理系统 之类的东西 并遇到一些资源授权问题 假设有club and club有经理 我想检查用户是否是经理club在他可以使用中间件管理它之前 使用 Laravel 5 2 My router看起来像这样 Rou
  • 在php mysql排行榜表中显示用户排名?

    我创建了一个测验页面 将登录用户的测验结果存储到排行榜 我有一个名为 Members 的表 其中包含 user 和 quiz score 列 我根据登录用户进行的测验结果打印出排行榜 我在个人资料页面的排行榜中显示特定用户的位置时遇到问题
  • 尝试跟踪错误,了解为何在 woocommerce 中触发 Webhook 后未发送电子邮件

    我试图了解为什么有时 webhook 似乎会触发 有时在 Woocommerce 中购买后不会触发 有一个自定义插件应该添加到custom topic我的理解是 woocommerce 插件 webhook 添加了以下代码 我将把整个代码放
  • 使用从另一个表 MYSQL 获取的值从一个表中选择行

    我的数据库中目前有 2 个 mysql 表 Film and Film Ratings Report Film 的主键是filmid用于识别电影分级Film Ratings Report table 我想知道是否可以仅使用 MYSQL 查询
  • MySQL:“SELECT 将检查超过 MAX_JOIN_SIZE 行”

    我正在使用 PHP 和 MySQL 在我的程序中 有一个涉及连接的选择查询 当我在本地主机上运行它时 它工作正常 但是当我将它上传到我的服务器上并尝试执行它时 它会生成以下错误 The SELECT would examine more t
  • 以编程方式将 Magento 订单标记为完整

    当我从第三方服务收到特定响应时 我尝试将 处理 订单标记为 完成 我已经为此做好了一切设置 但唯一的问题是订单仍处于处理状态 我正在生成发票 不过我认为我不需要这个 因为每个项目在 Magento 后端都被标记为 已开票 和发货 如下所示
  • session_regenerate_id(true) ajax 请求或快速刷新时的无效会话

    为了避免会话固定 我在每个 PHP 页面的开头使用以下代码 session set cookie params 900 domain 1 1 session start session regenerate id true 但如果页面刷新太
  • 如何在 Ubuntu 22.04 LTS 上安装 MySQL 5.7?

    我工作的公司使用较旧的堆栈 我需要在 Ubuntu 22 04 LTS 上安装 MySQL 5 7 才能在本地处理一些项目 有谁知道该怎么做 除了在 Ubuntu 20 04 或更低版本上安装之外 我找不到任何东西 下载 wget http
  • 处理 PHP 中的会话劫持

    阅读了 Stackoverflow 上有关会话劫持的许多问题 我发现验证用户会话的唯一 解决方案 是检查用户代理 这是一个薄弱的保护层 我什至懒得去检查实施它 所以 我想知道你们实施了哪些解决方案 您是否使用 PHP 的本机会话或者是否有更
  • 使用PHP将大文件上传到谷歌云存储

    我正在尝试将大文件从服务器上传到云存储 文件超过 500mb 但 PHP 超时 我尝试查看 Google 客户端库文档 并在 stackoverflow 中进行爬行 但找不到任何可以帮助我的内容 还有有什么办法可以跟踪上传进度吗 这是我目前
  • 解决 php 常见冲突的最佳方法:忽略、修复还是其他?

    我正在尝试在 CentOS 6 上的 PHP 5 3 3 上安装 Soap 模块 来自 webtatic PHP 5 6 当我运行 yum 命令时yum install php56w soap要安装它 我收到以下消息 错误 php56w c
  • 无法使用 Alamofire 在 swift 3 中上传图像

    我在尝试让 Alamofire 上传图像时被困了三天 这个想法是 Alamofire 将其与一些 php 代码一起发送到服务器 经过大量尝试和查看不同的地方后 一些代码应该可以工作 但是 Alamofire 的服务器端文档很糟糕 最近对 s
  • 如何使用 php $row 检索 sql 日期时间对象?

    例如 sql SELECT FROM db query sqlsrv query conn sql while row sqlsrv fetch array query echo row date column 会崩溃 我找到的大多数答案都
  • PHP 中的 imagecolortransparent 不起作用

    我想改变图像中的白色 http www arso gov si vreme napovedi 20in 20podatki radar gif http www arso gov si vreme napovedi 20in 20podat

随机推荐

  • R 中截距回归模型的 abline 线不正确

    给出了可重现的示例 在下面 我得到一条 y 截距约为 30 的 abline 线 但回归表明 y 截距应该是 37 2851 我哪里错了 mtcars mpg 21 0 21 0 22 8 21 4 32 obs mtcars wt 2 6
  • 如何将参数从一个 Perl 脚本传递到另一个?

    我有一个运行的脚本 运行后它有一些信息需要传递给下一个要运行的脚本 Unix DOS 命令如下 perl x s param send pl perl x s param receive pl param send pl 是 Send pa
  • Java 9:什么是集合工厂方法? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 Java 9 的到来为 Java 的 Collections API 带来了许多新功能 其中之一就是集合工厂方法 它们是什么以及我如何正确实施它们 Note 1 To preve
  • 仅使用C语言的分布式系统设计

    我的工作是实现一个分布式节点系统 如 p2p 节点 每个节点 比如 A B C 和 D 执行某些功能 并且需要彼此交互以进行各种操作 例如同步操作和其他操作例如 15 个 A 节点与一组 5 个 B 节点交互 进入负载最少的节点队列并获取令
  • 检测图像中的字体

    我有一个非常奇怪的要求 即应该检测 JPG 图像中文本的字体 如何做呢 我想知道有什么办法可以做到这一点 提前致谢 您可以尝试这些服务 什么字体我认为这是识别图像中字体的最准确的服务 不是完全自动化的并且有限制 它只会匹配 MyFonts
  • 如何在 GitHub 上进行快进合并?

    因此 我的一位同事尝试使用 GitHub 的 Web 界面中的 通过快进合并 选项来合并分支 以保持历史记录免受虚假合并提交的影响 master自要合并的功能分支启动以来 它们合并到的分支尚未取得进展 有趣的是 这并没有按预期工作 所有提交
  • 为什么我不能将 C# 方法声明为虚拟方法和静态方法?

    我有一个辅助类 它只是一堆静态方法 并且想对辅助类进行子类化 有些行为是唯一的 具体取决于子类 因此我想从基类调用虚拟方法 但由于所有方法都是静态的 我无法创建普通的虚拟方法 需要对象引用才能访问虚拟方法 有没有办法解决 我想我可以使用单例
  • 从 JsRender 中的嵌套块访问父变量

    我怎样才能访问props s key来自嵌套的for props object items key for prop other items key here I want to print the key from props 我试过了
  • 配置 Eclipse 以在工作区外部添加 buildpath 文件夹

    我正在 Mac 上开发 PHP 根据其他建议 我已将工作区设置在 MAMP 的 HTDOCS 文件夹中 不幸的是 这意味着我不能像在生产中那样使用 的链接 有什么建议么 相关地 工作区似乎阻止引用工作区外部的构建路径 但我想将敏感文件保留在
  • jQuery:我可以自动将插件应用到动态添加的元素吗?

    我正在将我的 Web 应用程序转换为完全 AJAX 架构 我有一个最初加载的母版页和一个加载动态内容的 div 容器 我创建了一些 jQuery 插件 将它们应用于某些元素以扩展它们的功能 我通常会在每个页面加载期间按如下方式调用这些函数
  • 如何通过匹配 BeautifulSoup 中元素属性中的文本来获取元素

    我有这个代码 a title Next Page Results 1 to 60 href class smallfont gt a 我想抓住a元素并获取 href 我怎样才能匹配title属性与Next Page 我想部分匹配标题属性中的
  • 限制 Git 分支访问的方法?

    我的 git 存储库中有四个分支 使用 GitHub 进行管理 生产 Staging Master 人名 发展 有没有办法限制对单个分支 人名 开发 的写访问 我该怎么做 类似问题 供参考 如何编写 git hook 来限制写入分支 使用
  • 哪个 Django 表单字段可以为我提供 的 HTML 输出?

    我有一个带有此输入的 html 表单
  • 开发模式下的GWT + JSTL——可能吗?

    我有一个 GWT 应用程序 由 roo 生成 我决定使用 Spring Security 来保护它 Roo 生成一个 login jspx 页面作为安全设置的一部分 并且此 jspx 使用一些基本的 JSTL 标记库 当在开发模式下运行时
  • 包含标头时防止出现多个 #define

    来自 python 我对正确的方法有点困惑 我正在尝试将该库包含在我的项目中 https github com nothings stb blob master stb image h 为此 我必须在导入文件之前 define STB IM
  • 如何在 JPA2 中强制使用 @ManyToOne 字段?

    我正在为应用程序设计持久性存储库 我是新来的休眠 JPA2我遇到了麻烦创造更复杂的关系在这种情况下外部强制键 一个例子 只是在记事本上写的 所以不完全是这样 我有一个名为 Person 的顶级类 它可以担任多个职位 另一个类 如果我像这样映
  • 低延迟地从 IP 摄像机获取帧

    我当前正在使用此命令从 RTSP 流获取帧并从标准输出读取帧 ffmpeg nostdin rtsp transport tcp i
  • 如何仅在图像悬停时显示 fancybox 标题

    我正在使用Fancybox插件对于图像库 我想仅当用户将鼠标悬停在图像上时显示图像标题 我不知道要修改代码的哪一部分才能完成此任务 我尝试通过添加来编辑 CSSa hover声明如下 fancybox title over wrap 我什至
  • 将日期对象转换为日历对象[重复]

    这个问题在这里已经有答案了 因此 我从传入对象中获取以下形式的日期属性 Tue May 24 05 05 16 EDT 2011 我正在编写一个简单的辅助方法将其转换为日历方法 我使用以下代码 public static Calendar
  • MySQL Inner Join 有限制吗?

    我有这个查询来收集有关单个订单的信息 它变得非常复杂 我没有任何数据可以测试 所以我问 如果有人在小型和大型数据集中有这方面的经验 那么您可以或应该在单个查询中进行多少个连接是否有限制 将大型查询分成较小的部分是否明智 或者这不会产生重大影