【问题标题】:Which MySQL query is best for getting data from two tables哪个 MySQL 查询最适合从两个表中获取数据
【发布时间】:2014-03-16 06:43:59
【问题描述】:

我有两张这样的表:

mysql> desc table1;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> desc table2;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   |     | NULL    |       |
| name  | varchar(255) | NO   |     | NULL    |       |
| age   | int(11)      | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

两个表中各自数据的 ID 字段相同。

数据库引擎:MYISAM

我想从两个表中获取数据,为此我一直在尝试各种查询。

以下所有查询都可以正常工作,但我想知道性能方面的最佳查询,表包含 2000 万+条记录。

查询 1

SELECT t2.age, t1.name
FROM table2 t2
LEFT JOIN table1 t1 ON t2.id = t1.id
WHERE t1.id =1
AND t2.id =1

查询 2

SELECT table1.name, age
FROM table1, table2
WHERE table1.id =1
AND table2.id =1

查询 3

SELECT  table1.name , table2.age 
FROM table1, table2 
WHERE table1.id = 1 
AND table2.id = 1

查询 4

SELECT table1.name, table2.age
FROM table1
INNER JOIN table2 ON table1.id = table2.id
WHERE table1.id =1
AND table2.id =1

查询 5

SELECT table1.name, age
FROM table1, table2
WHERE table1.id =1
AND table2.id =1

那么哪一个最适合用于高负载/流量站点?最适合性能?

谢谢

【问题讨论】:

  • 只是一个简短的评论。在查询 1 和 4 中,您已经定义了关系 t1.id=12.id,因此指定 t1.id=1t2.id=1 是多余的。这些陈述之一就足够了。

标签: mysql query-optimization myisam


【解决方案1】:

如果您想从两个表中获取数据,并且仅在id = 1 时获取数据,您可以使用limit 1 而不是WHERE table1.id =1 AND table2.id =1

如果相同的 id 存在于 2 个表中,你想获取数据,你应该 INNER JOIN 你的表

SELECT t2.age, t1.name
FROM table2 t2
INNER JOIN table1 t1 ON t2.id = t1.id
LIMIT 1

SELECT t2.age, t1.name
FROM table2 t2, table 1
WHERE t1.id = t2.id
LIMIT 1

【讨论】:

  • 一些数据库引擎可以更好地优化连接,所以我会采纳你的第一个建议。
  • @Racil Hilan:加入比 what 更好?第二个是隐式写入的内部连接。大多数数据库引擎会在执行前将第一个查询转换为第二个查询。
  • @zerkms 哦,我的错。我正在阅读几篇帖子并将我的评论输入错误的帖子。您在这里绝对正确,上述两个建议之间的性能没有差异。有些人更喜欢其中之一。但是,显式连接提供了更清晰的意图,因为它们表示两组数据之间的语义关系,而WHERE 建议使用过滤集。但正如您所指出的,数据库引擎将它们转换为相同的计划。
  • @Racil Hilan:确实如此。就我个人而言,我也没有理由使用隐式形式。
  • @user2022549 您的建议是否缺少排序? 'ORDER BY t1.id. Otherwise, how is LIMIT 1` 保证获得该特定行?
【解决方案2】:

为了避免对 table2 进行全表扫描,我建议您在“table2.id”字段上添加索引,然后您可以执行“解释”,看看哪个更好。

正如您所描述的,您的所有查询都将执行几乎相同的操作,但是如果不在 table2 上添加索引,则将读取该表上的所有记录。尝试一下并与您当前的结果时间进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2020-12-17
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多