Ускорить SELECT из нескольких таблиц - PullRequest
1 голос
/ 01 ноября 2011

Мне нужно ускорить запрос sql.Или лучше обрабатывать PHP-код.Некоторые рекомендации при поиске в базе данных и отображении результатов во внешнем интерфейсе.

В основном у меня есть три таблицы - ящики, которые содержат записи - записи, которые содержат песни - песню

Я хотел бы, чтобы мойКод внешнего интерфейса для перечисления чего-то вроде:

Box 1
 -Record 1
  --Song 1
  --Song 2
    etc....
 -Record 2
  --Song 1
  --Song 2
    etc....
Box 2
 -Record 1
  --Song 1
  --Song 1
etc. etc. etc.

«Мой путь» очень трудоемкий:

  1. Я ищу в таблице «Box», используя стандартный SQL.
  2. Для каждой строки я вызываю функцию, которая находит каждую запись для этого блока
  3. Для каждой записи я вызываю функцию, которая находит каждую песню для этой записи

Требуется много времени, чтобызавершено, поскольку количество вызовов select огромно (много ящиков, много записей)

Я думаю, что есть более простой способ (с точки зрения серверов) сделать то же самое.Потяните dato к массивам php и там к логике или к чему-то более умному.

Вопрос: Как лучше всего получать данные из реляционной базы данных с помощью php?

Br.Андерс

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Вам нужно узнать о JOIN с.Здесь вы бы использовали два внешних соединения.Таким образом, вы достигаете того же результата, используя только один запрос select, и объем работы, который должен выполнять PHP и MySQL, намного меньше.

Ваш SQL будет выглядеть примерно так: (Обратите внимание, чтоЯ использую SELECT * в качестве замены для реального списка столбцов, потому что я не знаю, какие у вас есть столбцы - использование SELECT *, как правило, не очень хорошая идея)

SELECT
    *
FROM
    Box
    LEFT JOIN Record ON Box.BoxID = Record.BoxID
    LEFT JOIN Song ON Record.RecordID = Song.RecordID
2 голосов
/ 01 ноября 2011

Операция выбора на основе одного набора будет быстрее, чем многие операции выбора на основе одной строки.

Вы достигаете этого, используя соединения см .: http://en.wikipedia.org/wiki/Join_(SQL)

Я понятия не имею о вашей структуре базы данных, так что это не будет рабочим примером, Вот как вернуть все песни для определенной коробки.

SELECT s.* FROM box b
INNER JOIN record r ON r.box_id = b.box_id
INNER JOIN song s ON s.record_id = r.record_id
WHERE box.name = 'mybox'

будет быстрее, чем:

select from box b
   where box.name = 'mybox'
LOOP
  select record_id from record 
  LOOP
      select * from song
  END 
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...