ПРИСОЕДИНЯЙТЕСЬ к нескольким запросам, когда есть 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 будет быстрее, я не прав?

0

Решение

Движок может указать свою собственную реализацию, но MySQL не будет читать всю таблицу: он будет делать LIMIT одновременно с JOIN, выбирая строку за строкой, пока не найдет 5 строк.

1

Другие решения

MySQL Engine: InnoDB использует блокировку уровня строки в таблице, то ПРЕДЕЛ будет работать одновременно с ПРИСОЕДИНИТЬСЯ, выборка строка за строкой, пока он не нашел 5 строк.

0

По вопросам рекламы [email protected]