哪个查询更优化?

时间:2019-11-25 08:05:49

标签: mysql sql query-optimization

我想知道下面提到的是最好的查询。每个表中将有超过10万条记录。我需要优化我的sql查询以获得更好的性能。

第一查询

SELECT
    *
FROM 
    (SELECT
        id,
        name,
        city,
        country
    FROM
    VaccinationCenters 
    ) as vc
INNER JOIN
    (SELECT
        id as orderId,
        vendorId,
        perCardValue,
        vaccinationCenterId,
        amount,
        cardType as cardStyle,
        deliveryCharge,
        currency
    FROM
    Orders
    WHERE
    vendorId='ven001'
    )as cc
ON
    vc.id=cc.vaccinationCenterId;

第二个查询

SELECT
        vc.id,
        vc.name,
        vc.city,
        vc.country,
        o.id as orderId,
        o.vendorId,
        o.perCardValue,
        o.vaccinationCenterId,
        o.amount,
        o.cardType as cardStyle,
        o.deliveryCharge,
        o.currency
    FROM
    VaccinationCenters vc,
    Orders o
    WHERE
        vc.id=o.vaccinationCenterId
        AND
        o.vendorId="ven001";

这两个查询都给出相同的结果。我只想知道哪个是最佳的优化查询,或者是否还有另一种优化交易的方法。

3 个答案:

答案 0 :(得分:0)

SELECT
    * FROM 
    (SELECT
        id,
        name,
        city,
        country
    FROM
    VaccinationCenters 
    ) as vc INNER JOIN
    (SELECT
        id as orderId,
        vendorId,
        perCardValue,
        vaccinationCenterId,
        amount,
        cardType as cardStyle,
        deliveryCharge,
        currency
    FROM
    Orders
    WHERE
    vendorId='ven001'
    )as cc ON
    vc.id=cc.vaccinationCenterId;

您的第一个查询最好是因为。它拥有所有的疫苗接种中心,并将它们与所有订单合并。

其他人获得所有疫苗接种中心并获得所有订单并将其合并。

那是不同的

答案 1 :(得分:0)

我认为,与EmreKalafat的回答相反,第二个更好。在第一个查询中,您将创建2个独立查询并将其合并。在第二篇文章中,您为数据库系统提供了优化的不错选择,尤其是在vc.id和/或o.vaccinationCenterId是密钥的情况下。

无论如何,您可以尝试mysql -vv ...(也许在具有不同条件的循环中)来找出使用时间。另一种方法是使用mysql的性能自测试。

答案 2 :(得分:0)

在MySQL中,从性能角度来看,第二个要好得多。 MySQL倾向于实现子查询。这意味着它倾向于在FROM子句中写出子查询。

这样做会丢失索引以及有关表的其他有用信息。这阻碍了优化器。

其他数据库不执行此操作。在其他数据库中,优化程序将忽略子查询。实际上,MySQL的最新版本也对此有所改善,但我仍然不会抓住机会。

尽管它不会影响优化,但应使用正确的,明确的标准 JOIN语法编写查询。 请勿在{{1​​}}子句中使用逗号。

FROM

对于此查询,您希望在以下位置建立索引:

  • SELECT . . . FROM VaccinationCenters vc JOIN Orders o ON vc.id = o.vaccinationCenterId WHERE o.vendorId = 'ven001';
  • Orders(vendorId, vaccinationCenterId)

假设VaccinationCenters(id)被声明为主键,您可能已经有了第二个索引。