我想知道下面提到的是最好的查询。每个表中将有超过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";
这两个查询都给出相同的结果。我只想知道哪个是最佳的优化查询,或者是否还有另一种优化交易的方法。
答案 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)
被声明为主键,您可能已经有了第二个索引。