У меня есть две таблицы, как показано ниже:
// 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 будет быстрее, я не прав?
Движок может указать свою собственную реализацию, но MySQL не будет читать всю таблицу: он будет делать LIMIT
одновременно с JOIN
, выбирая строку за строкой, пока не найдет 5 строк.
MySQL Engine: InnoDB использует блокировку уровня строки в таблице, то ПРЕДЕЛ будет работать одновременно с ПРИСОЕДИНИТЬСЯ, выборка строка за строкой, пока он не нашел 5 строк.