2016-12-05 32 views
0

我有一个像下面两个表:JOIN VS多个查询时,有LIMIT 5

// posts 
+----+---------+------------------+-----------+ 
| id | title |  content  | author_id | 
+----+---------+------------------+-----------+ 
| 1 | title1 | content1   | 123  | 
| 2 | title2 | content2   | 456  | 
| . | .  | .    | .   | 
| . | .  | .    | .   | 
| . | .  | .    | .   | 
+----+---------+------------------+-----------+ 

// users 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Jack | 
| 2 | Peter | 
| . | .  | 
| . | .  | 
| . | .  | 
+----+-------+ 

我想选择5个帖子象下面这样:

SELECT * FROM posts WHERE 1 ORDER BY id LIMIT 5 

我还需要得到的名称作者每个帖子。所以,我可以做到这一点通过使用JOIN这样的:

SELECT p.*, u.name 
FROM posts p 
JOIN users ON p.author_id = u.id 
WHERE 1 
ORDER BY id 
LIMIT 5 

我是这样做的另一种方式:

SELECT * FROM posts WHERE 1 ORDER BY id LIMIT 5 
// storing results in a PHP array named $results 
foreach($results as $result) { 
    SELECT name FROM users WHERE id = $result['author_id'] 
    // storing results in a PHP array named $names 
} 
// combining $names and $results to make expecting result 

那么,哪种方法是巨大的数据集更有效率?换句话说,JOIN发生在LIMIT之前吗?如果是的话,那么我想这样做的PHP会更快,我错了吗?

回答

1

引擎可以指定自己的实现,但MySQL不会读取整个表格:它将在JOIN的同一时间执行LIMIT,一行一行地读取,直到找到5行。

+0

啊,我明白了,thx +1 – stack

+0

@stack感谢+1,但请记住,如果答案已妥善回答您的问题,您可以接受答案。 :) –

0

MySQL的引擎:InnoDB的使用在表中的行级锁,然后LIMIT将在同一时间工作的JOIN,取一行行,直到它已发现5行。