多表选择语句的性能

时间:2014-12-23 18:31:57

标签: mysql

我对SQL非常陌生,我试图弄清楚"最好的方法"在涉及多个表时执行选择。不幸的是,我的数据集非常小(从而使这个问题相当学术化),所以无论如何一切都在相同的时间内返回。

我有以下表格(但抽象数据名称较少):

mysql> describe tblA
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| ID             | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| A_data         | varchar(20) | YES  |     | null    |                |
| B_ID           | bigint(20)  | NO   | MUL | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblB
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| ID             | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| B_data         | varchar(20) | YES  |     | null    |                |
| C_ID           | bigint(20)  | NO   | MUL | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblC
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| ID             | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| C_data         | varchar(20) | YES  |     | null    |                |
+----------------+-------------+------+-----+---------+----------------+

似乎有三种方法可以安排查询以获得给定C_data特定值的A_data:

SELECT A_data FROM tblA,tblB,tblC
  WHERE (tblC.C_data=searchKey AND tblB.C_ID=tblC.ID AND tblA.B_ID=tblB.ID)

SELECT A_data FROM tblA
  INNER JOIN tblB ON tblA.tblB_ID=tblB.ID
  INNER JOIN tblC ON tblB.tblC_ID=tblC.ID
  WHERE tblC.C_data=searchKey

SELECT A_data FROM tblA
  WHERE tblB_ID IN (
    SELECT ID FROM tblB WHERE tblC_ID IN (
      SELECT ID FROM tblC WHERE tblC_data=searchKey
    )
  )

我对这些技术的相对分支和优点(如果有的话)感到好奇。例如,加入三个表只是为了进行搜索似乎打败了将它们保存在单独的表中的观点,但相反,我不确定嵌套选择的智慧。我还不确定第一个案例背景中究竟发生了什么。

2 个答案:

答案 0 :(得分:1)

使用第二种形式。它是三者中最常见,最易读的。

  • MySQL可能会在内部使第一个表单与第二个表单相同。检查执行计划。任何方式,都不容易理解,因为3个表之间的关系并不是很明显。
  • 第三种形式更难以优化,尤其是涉及更多表格时。避免它。

答案 1 :(得分:0)

警告:不是我的专业领域,这不是你问题的直接答案。但是,查看MySQL优化器跟踪选项可能对您有用,因为它应该说明查询优化器对SQL的作用以及它实际执行它的方式。 相关链接:

http://dev.mysql.com/doc/internals/en/optimizer-tracing.html - (官方oracle文档) http://jorgenloland.blogspot.com/2011/10/optimizer-tracing-query-execution-plan.html - (关于使用和输出及其含义的说明,来自优化器开发)