Mysql 多表选择与联接(性能)
在MySQL中从多个表中进行选择时,以下两个查询都返回相同的结果集 这些查询中的一个比另一个更好还是更高效?根据我对一个小数据集(每个表中约2k行)的测试,它们都在大约相同的执行时间内返回相同的结果集 查询1:Mysql 多表选择与联接(性能),mysql,Mysql,在MySQL中从多个表中进行选择时,以下两个查询都返回相同的结果集 这些查询中的一个比另一个更好还是更高效?根据我对一个小数据集(每个表中约2k行)的测试,它们都在大约相同的执行时间内返回相同的结果集 查询1: SELECT * FROM products, product_meta, sales_rights WHERE ( products.id = product_meta.product_id AND produc
SELECT
*
FROM
products,
product_meta,
sales_rights
WHERE
(
products.id = product_meta.product_id
AND products.id = sales_rights.product_id
)
AND (...)
LIMIT 0,10;
SELECT
*
FROM
products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id
WHERE
(...)
LIMIT 0,10;
查询2:
SELECT
*
FROM
products,
product_meta,
sales_rights
WHERE
(
products.id = product_meta.product_id
AND products.id = sales_rights.product_id
)
AND (...)
LIMIT 0,10;
SELECT
*
FROM
products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id
WHERE
(...)
LIMIT 0,10;
它们是相同的,但语法不同。因此,您不应该期望这两个语法之间有任何性能差异。但是,建议使用最后一种语法(ANS SQL-92语法),有关更多详细信息,请参阅:
- 我认为这是一个很好的解释
内部联接是您应该使用的ANSI语法
通常认为它更具可读性,尤其是当您加入时
很多桌子
它也可以在需要时轻松地替换为外部连接
出现
WHERE语法更面向关系模型
两个表连接的结果是要连接的表的笛卡尔积
应用了一个过滤器,该过滤器仅选择具有连接的行
列匹配
使用WHERE语法更容易看到这一点
对于您的示例,在MySQL中(以及在SQL中),这两个查询
是同义词
还要注意,MySQL还有一个STREAT_JOIN子句
使用此子句,可以控制联接顺序:哪个表是
在外循环中扫描,哪个在内循环中
您无法在MySQL中使用WHERE语法来控制这一点
始终使用第二种,这是现代的做法!体面的DBMS应该有一个查询优化器,它可以消化输入查询并找出运行它的最佳方式。因此,查询优化器应该同样处理您提到的查询。在我的设置Oracle SQL Developer 3.1.06中,“从t1、t2、t3中选择”,比“从t1中选择内部连接t2打开…”的等效查询快0016s:0094s vs 0109s。尽管正如答案所指出的那样,可读性有所下降。