Что быстрее; в том числе другой файл или запрос базы данных MySQL в PHP? - PullRequest
8 голосов
/ 03 октября 2008

В PHP, что быстрее; используя include('somefile.php') или запрашивая базу данных MySQL простым запросом SELECT, чтобы получить ту же информацию?

Например, скажем, у вас было поле поиска автозаполнения JavaScript, для которого требовалось 3000 терминов. Быстрее ли читать эти термины из другого файла, используя include, или читать их из базы данных MySQL, используя простой запрос SELECT?

Редактировать: Предполагается, что база данных и файл, который я хочу включить, находятся на той же локальной машине, что и мой код.

Ответы [ 12 ]

14 голосов
/ 03 октября 2008

Это зависит. Если ваш файл хранится локально на вашем сервере, а база данных установлена ​​на другом компьютере, то быстрее будет включить файл.

Buuuuut, потому что это зависит от вашей системы, это может быть неверно. Я предлагаю вам сделать тестовый скрипт PHP, запустить его 100 раз из командной строки и повторить тест через HTTP (используя cURL)

Пример:

use_include.php

<?php

  start = microtime(true);

  include( 'somefile.php' );

  echo microtime(true)-start;

?>

use_myphp.php

<?php

  start = microtime(true);

  __put_here_your_mysql_statements_to_retrieve_the_file__

  echo microtime(true)-start;

?>
4 голосов
/ 03 октября 2008

Включение файла почти всегда должно быть быстрее. Если ваша база данных находится на другом компьютере (например, на виртуальном хостинге) или в конфигурации с несколькими серверами, поиск должен будет сделать дополнительный скачок.

Однако на практике разница, вероятно, не будет иметь значения. Если список динамический, то его сохранение в MySQL сделает вашу жизнь проще. Статические списки (например, страны или штаты) могут храниться в PHP include. Если список довольно короткий (несколько сотен записей) и часто используется, вы можете загрузить его прямо в JavaScript и покончить с AJAX.

Если вы идете по маршруту MySQL и беспокоитесь о скорости, используйте кэширование.

$query = $_GET['query'];
$key = 'query' . $query;
if (!$results = apc_fetch($key))
{ 
    $statement = $db->prepare("SELECT name FROM list WHERE name LIKE :query");
    $statement->bindValue(':query', "$query%");
    $statement->execute();
    $results = $statement->fetchAll();
    apc_store($key, $results);
}

echo json_encode($results);
3 голосов
/ 03 октября 2008

Разница во времени больше связана с дизайном системы, чем с базовой техникой, которую я бы осмелился сказать. И результат MySQL, и файл могут быть кэшированы в памяти, и разница в производительности будет настолько мала, что пренебрежимо мала.

Вместо этого я бы спросил себя, в чем будет разница в обслуживании. Вы вероятно когда-нибудь измените данные? Если нет, просто вставьте его в простой файл. Вы можете менять биты контента так часто? Если это так, с базой данных гораздо проще манипулировать. То же самое для структуры данных, если она нуждается в «реструктуризации», может быть, более эффективно поместить ее в базу данных?

Итак: делайте то, что вы считаете наиболее удобным для вас и будущего сопровождающего кода и данных. : -)

2 голосов
/ 03 октября 2008

Очень трудно / невозможно дать точный ответ, так как слишком много неизвестных переменных - что, если файловая система смонтирована на NFS , которая находится на другом конце света? Или у вас есть вся база данных MySQL в памяти. Размер базы данных также должен учитываться.

Но, на более заметном ответе, можно предположить, что MySQL быстрее , с хорошими показателями, хорошей структурой / нормализацией базы данных и не слишком сложными / сложными запросами. Операции ввода / вывода всегда дороги (читай: медленно), хотя, как уже упоминалось, весь набор данных уже кэшируется в памяти MySQL.

Кроме того, я думаю, вы подумали о дальнейшей обработке строк с этими включенными файлами, что делает вещи еще более хлопотными - я убежден, что алгоритмы поиска строк в MySQL намного лучше оптимизированы, чем то, что вы могли бы придумать в PHP. *

1 голос
/ 03 октября 2008

Если это то, что вы собираетесь извлекать на регулярной основе, возможно, имеет смысл предварительно извлечь данные (с диска или из базы данных, не имеет значения) и ваш скрипт извлекает их из кеша ОЗУ, например memcached .

0 голосов
/ 03 октября 2008

Если вы используете кеш байт-кода PHP, такой как APC или Xcache, включение файла, вероятно, будет быстрее. Если вы используете PHP и хотите повысить производительность, кеш байт-кода абсолютно необходим.

Похоже, вы рассматриваете возможность хранения статических данных в включенном вами PHP-скрипте, чтобы избежать попадания в базу данных. Вы в основном делаете элементарный кеш. Это может работать нормально, если у вас есть какой-то способ обновить этот файл, если / когда данные изменятся. Возможно, вы захотите узнать больше о MySQL Query Cache, чтобы быстрее выполнять запросы SQL к статическим данным. Или Memcached для хранения статических данных в памяти.

0 голосов
/ 03 октября 2008

У меня недавно была эта проблема. У меня были некоторые данные в MySQL, которые я запрашивал при каждом запросе страницы. Для моего набора данных было проще написать файл с фиксированной длиной записи, чем использовать MySQL.

Было несколько факторов, которые сделали файл быстрее, чем MySQL для меня:

  1. Размер файла был небольшим - до 100 КБ текстовых данных
  2. Я выбирал случайно, а не искал - индексы не имели значения
  3. Время подключения - открытие файла и чтение его происходило быстрее, чем подключение к базе данных при высокой нагрузке на сервер Это было особенно верно, поскольку ОС кэшировала файл в памяти

Суть в том, что я сравнил результаты и сравнил их. Для моей рабочей нагрузки файловая система была быстрее. Я подозреваю, что если мой набор данных когда-либо увеличится, это изменится. Я буду следить за производительностью и буду готов изменить ее работу в будущем.

0 голосов
/ 03 октября 2008

Если вы ожидаете, что число терминов будет увеличиваться позднее, лучше использовать MySQL с полем полнотекстового поиска .

0 голосов
/ 03 октября 2008

Почему бы не сделать это обоими способами и посмотреть, что быстрее? Оба решения довольно тривиальны.

0 голосов
/ 03 октября 2008

Чтение необработанных данных в сценарии из файла обычно происходит быстрее, чем из базы данных.

Однако, похоже, что вы хотите запросить эти данные, чтобы найти совпадение, чтобы вернуться к JavaScript. В этом случае вы можете обнаружить, что MySQL будет быстрее для фактического запроса / поиска данных (особенно, если они правильно проиндексированы и т. Д.), Поскольку это хорошо для базы данных.

Чтение в большом файле также менее масштабируемо, поскольку при выполнении сценария вы будете использовать много памяти сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...