我想知道内部联接在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的连接吗?因为当我以这种方式这样做时,它是超级DUPER慢。
有没有办法做一些事情:
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';
类似的东西
答案 0 :(得分:2)
连接速度非常不可能比三次数据库命中慢。如果MySQL的查询优化器完全胜任,重新排序这些条款不应该产生影响。 WHERE
/ ON
子句中的列是否已编入索引?
答案 1 :(得分:2)
我认为您会发现查询优化器会在大多数情况下为您提供最佳查询。您需要查看执行计划以找出查询速度慢的原因 - 我的猜测是缺少索引。
当MySql查看这些表时,它通常会以最佳方式获得最佳速度 - 如图所示的简单连接不会混淆查询优化器,但缺少索引会导致数据库引擎扫描表而不是查找值(即它需要逐行遍历表以匹配您指定的条件)
索引可确保引擎无需搜索叶页级别,通常可加快查询速度
这里的表格结构是什么,或者这都是假设的?
使用SQL的一般经验法则是 - 尝试并查看!
答案 2 :(得分: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”。
但是,查询优化器应该已经这样做了,所以此查询应该与原始查询的执行方式类似。
有关索引的更多帮助,了解哪些将有助于您进行数据库开发,请首先查看this one.等教程
答案 3 :(得分:1)
使用您的第一个查询,mySql查询优化器应该选择最快的策略
如果您希望它更快,请确保name
列上有索引