2014-10-19 9 views
1

Представьте, что есть база данных SQLite с двумя таблицами: «пользователи» и «ранги», одна содержит имена пользователей и их ранг как число (и идентификатор пользователя), другая содержит номера рангов и имя ранга. Целью является вывод таблицы html с именем ранга и именами пользователей (и их идентификатором пользователя).Производительность запроса нескольких баз данных

<?php 
$db1 = new PDO('sqlite:database'); 
$db2 = new SQLite3('database'); 
$result = $db1->query("SELECT * FROM users ORDER BY rank DESC"); 

echo '<table><tr><td>rank</td><td>username</td><td>id</td></tr>'; 
$data = ""; 
foreach($result as $row){ 
    $data .= 
    '<tr><td>'.$db2->querySingle("SELECT rankname FROM ranks WHERE ranknumber =".$row['rank']).'</td>'. 
    '<td>'.$row['name'].'</td>'. 
    '<td>'.$row['id'].'</td></tr>'; 
} 
echo $data; 
echo "</table>"; 
?> 

Этот код работает отлично в небольших масштабах, вопрос заключается в его исполнении после того, как база данных очень заселена. По сути, он делает новый запрос к базе данных для каждой выводимой строки первого запроса, правильно? Я добавил использование $ data вместо того, чтобы повторять каждую строку один за другим исключительно в том случае, если это может каким-то образом уменьшить запросы где-то вдоль дороги, но я не уверен, что это даже сделает какие-либо положительные изменения. Я слишком неопытен с обработкой базы данных и php, чтобы узнать, насколько сильно этот код будет помещен на сервер и/или сеть по сравнению с просто двумя вопросами рядом, будет ли мой код по существу выполнять сотни, если не тысячи запросов к базе данных, и как это повлияет на производительность? Кроме того, если это плохо, что я могу с этим поделать? Есть ли другой способ добиться тех же результатов без проблем с производительностью?

Что еще более важно, что если я также заменю имя пользователя на отображаемое имя из совершенно другой базы данных, отличной от SQLite (MySQL)? 201 запросов для отображения 100 пользователей, означает ли это массовое умножение использования ресурсов?

+3

звучит как задание для «присоединиться». Если вы еще не знакомы с SQL-соединениями, вот хороший учебник: http://www.tutorialspoint.com/sqlite/sqlite_using_joins.htm. Что касается «эффективности»: вы, как правило, хотите сделать так, чтобы было возможно * несколько запросов. Отсюда предлагается рассмотреть возможность использования соединения. – paulsm4

+1

@ paulsm4 join сделал трюк, работает как шарм, как будто все мои данные были в одном столе, спасибо! – KittenCodings

ответ

1

Как правило, выдача запроса является дорогостоящей операцией - это требует большой работы со стороны базы данных (синтаксическая проверка, проверка разрешений, построение плана выполнения, дискового ввода-вывода, сетевого трафика от БД и т. д.).

Разумеется, никакое правило не является доказательством 100%, и вы всегда должны ориентироваться на свою конкретную учетную запись, но в большинстве случаев выполнение одного «большого» запроса будет значительно лучше, чем выполнение «малых». В вашем USECASE, вы можете использовать синтаксис join, чтобы получить все необходимые результаты в одном запросе:

SELECT users.*, ranks.rankname 
FROM  users 
JOIN  ranks ON users.rank = ranks.ranknumber 
ORDER BY users.rank DESC 
+0

Ничего себе, SQL-запросы, являющиеся такой старой и простой в использовании функциональностью на поверхности, я не думал, что это на самом деле такое тяжелое действие для выполнения ... тогда мой «запрос», выполняющий запрос для каждого результата другого запроса, будет действительно плохая идея, это то, чего я боялся и что отвечает на вопрос, спасибо. Кроме того, JOIN сделал для меня трюк для двух таблиц в одной базе данных, и теперь я пытаюсь понять, как прикрепить другую базу данных к моему запросу, большое спасибо, вы сделали мой день лучше, и я надеюсь, что у вас будет хороший тоже – KittenCodings

Смежные вопросы