1

我想知道内部连接在 mysql 中究竟是如何工作的。

如果我做

SELECT * FROM A a 
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2
WHERE name='Paul';

它是否先进行连接,然后选择 name = paul 的连接?因为当我这样做时,它超级慢。

有没有办法做一些事情:

SELECT * FROM (A a WHERE name='paul')
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2]

当我以这种方式尝试时,我只是得到一个错误。

或者,最好只有 3 个单独的查询,一个用于 A、B 和 C?例子:

string query1 = "SELECT * FROM A WHERE name = 'paul'";
//send query, get data reader
string query2 = "SELECT * FROM b WHERE b = " + query1.b;
//send query, get data reader
string query3 = "SELECT * FROM C WHERE c = " + query1.c;
//send query, get data reader

显然这只是伪代码,但我认为它说明了这一点。

哪种方式更快/推荐?

编辑 表结构:

**tblTimesheet**
int timesheetID (primary key)
datetime date
varchar username
int projectID
string description
float hours

**tblProjects**
int projectID (primary key)
string project name
int clientID

**tblClients**
int clientID
string clientName

The join that I want is:

select * from tblTimesheet time
INNER JOIN tblProject proj on time.projectID = proj.projectID
INNER JOIN tblClient client on proj.clientID = client.clientID
WHERE username = 'paul';

类似的东西

4

4 回答 4

2

一个连接的速度极不可能比三个数据库命中慢。如果 MySQL 的查询优化器完全可以胜任,那么重新排序子句也不应该产生影响。WHERE/子句中的列是否被ON索引?

于 2012-06-29T16:09:45.513 回答
2

我认为您会发现查询优化器在大多数情况下都会为您提供最佳查询。您需要查看执行计划以找出查询缓慢的原因 - 我的猜测是缺少索引。

当 MySql 在这些表中查找时,它通常会以最佳方式来获得最佳速度 - 如您所示的简单连接不会混淆查询优化器,但缺少索引会导致数据库引擎改为扫描表查找值(即它需要逐行遍历表以匹配您指定的条件)

索引确保引擎不需要向下搜索到叶页级别,并且通常会加快查询速度

这里的表结构是什么,或者这都是假设的?

SQL 的一般经验法则是 - 试试看!

于 2012-06-29T16:10:15.220 回答
2

您可能缺少键表上的索引;您可以使用 MySql EXPLAIN关键字来帮助找出您的查询慢的地方。

回答您问题的另一部分;

is there a way to do something along the lines:

SELECT * FROM (A a WHERE name='paul')
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2]

您可以使用SubQuery

SELECT * 
FROM (SELECT * FROM  tblTimesheet WHERE username = 'Paul') AS time
INNER JOIN tblProject proj on time.projectID = proj.projectID
INNER JOIN tblClient client on proj.clientID = client.clientID

这个查询实际上是在尝试预过滤 JOIN 将操作的字段。它不会将所有字段连接在一起,然后将它们过滤掉,它只会尝试从 tblTimesheet 中首先连接名称为“Paul”的字段。

但是,查询优化器应该已经这样做了,因此该查询的执行应该与您的原始查询类似。

要获得更多关于索引的帮助,对索引的理解将极大地帮助您进行数据库开发,请从查看类似这样的教程开始。

于 2012-06-29T16:28:04.223 回答
1

使用你的第一个查询,mySql 查询优化器应该选择最快的策略

如果您希望它更快,请确保name列上有索引

于 2012-06-29T16:10:27.330 回答