Повторное использование результатов MySQL - PullRequest
1 голос
/ 02 февраля 2010

У меня есть несколько теоретический вопрос: я проектирую свою собственную CMS / app-framework (как это делали многие программисты PHP на разных уровнях раньше ... и всегда так будет), чтобы либо создать готовое к работе решение, либо разработать различные модули. / плагины, которые я буду использовать позже.

В любом случае, я собираюсь собрать соединения SQL из всего приложения и запустить их в одном месте:

index.php:
<?php
  include ('latestposts.php');
  include ('sidebar.php');
?>

latestposts.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

sidebar.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

Теперь, пока целое системное приложение еще не определено, его идея уже витает где-то в моем мозгу. Тем не менее, я думаю, что если я смогу сначала загрузить все функции gather_data, затем запустить sql, а затем запустить draw функции - и если я смогу повторно использовать результаты!

Если, например, $sql - это SELECT * FROM POSTS LIMIT 10, а $sql2 - это SELECT * FROM POSTS LIMIT 5, возможно ли запрограммировать PHP так: «ах, это тот же самый SQL, я вызову его только один раз и повторно использую первые 5 строк "?

Или возможно ли добавить это поведение в некоторые DRM?

Однако, как говорят теги, эта идея все еще находится в стадии разработки. Если это окажется легко осуществить, я напишу еще вопрос: :)

Итак, в основном: возможно ли это, имеет ли смысл? Если оба да, то ... есть идеи, как?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Не поймите меня неправильно, это звучит как правдоподобная идея, и вы, вероятно, сможете ее реализовать. Но мне интересно, будет ли это действительно полезно. Это заставит систему работать быстрее? Дай тебе больше контроля? Сделать разработку проще?

Я бы просто посмотрел на использование (или построение) системы с использованием хорошо зарекомендовавших себя стандартов кодирования в стиле MVC, построение хорошей структуры БД и настройку чёртов Apache (или использовать что-то вроде Lighttpd). У вас будет гораздо более широкое признание вашего кода, если вы когда-нибудь решите сделать его открытым исходным кодом, и если вам когда-нибудь понадобится помощь, другой разработчик может вмешаться и взять клавиатуру.

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

Все это в стороне, я думаю, что это возможно. =)

1 голос
/ 03 февраля 2010

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

Во-вторых, существуют определенные запросы, которые никогда не должны кэшироваться или которые должны выполняться снова, даже если они находятся вкэш.По большей части, только запросы SELECT и SHOW могут эффективно кэшироваться, но вам нужно беспокоиться об их аннулировании при изменении базовых данных.Даже в одном и том же просмотре страницы вы можете время от времени работать вокруг собственной кеш-системы.

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

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

...