PHP-Fusion SF - это система управления контентом (CMS) с открытым исходным кодом, написанная на PHP. Данная CMS использует mySQL базу данных, для хранения данных и мощную встроенную систему администрирования контента. PHP-Fusion SF является модифицированной версией PHP-Fusion.
1. Исправлены небольшие проблемы с совместимостью с MySQL 5.xx при регистрации новых пользователей.
2. Исправлена ошибка, при которой производилось автоматическое отключение вывода архива сайта, при отключении календаря.
3. Изменен алгоритм вывода даты у новостей и комментариев. Например если новость или комментарий были добавлены сегодня или вчера, то они выводятся в формате: " Сегодня, 12:34" или " Вчера, 12:34". В противном случае дата выводится в формате указанном в настройках скрипта. ...
Были подготовлены и реализованы следующие изменения:
1. Исправлены небольшие проблемы с совместимостью с MySQL 5.xx при регистрации новых пользователей.
2. Исправлена ошибка, при которой производилось автоматическое отключение вывода архива сайта, при отключении календаря.
3. Изменен алгоритм вывода даты у новостей и комментариев. Например если новость или комментарий были добавлены сегодня или вчера, то они выводятся в формате: " Сегодня, 12:34" или " Вчера, 12:34". В противном случае дата выводится в формате указанном в настройках скрипта.
4. Полностью переработан RSS экспорт на сайте. Добавлена возможность настраивать параметры экспорта из настроек скрипта. Также экспорт не использует больше шаблон rss.tpl необходимый формат формируется автоматически.
5. Добавлена возможность отключения RSS экспорта новостей в настройках скрипта, если вы не хотите использовать данную возможность, то можете отключить ее, тем самым будете экономить трафик сайта и предотвратите RSS граббинг ваших новостей.
6. Добавлена возможность выбора типа экспорта главного RSS канала сайта http://dle-news.ru/rss.xml вы можете экспортировать в него либо все новости, либо только опубликованные на главной странице.
7. В настройки скрипта добавлена возможность указания количества новостей, которые необходимо посылать в RSS поток.
8. Добавлена возможность выбора формата для RSS экспорта новостей. Есть три типа: первый тип это простой экспорт, при выборе этого типа вы сохраняете все преимущества RSS экспорта, но при этом из потока автоматически удаляется все форматирование текста, а также картинки, передается только сама суть новости, тем самым вы экономите траффик посетителей и усложняете RSS граббинг ваших новостей, т.к. те кто будет получать новости из вашего канала, будут получать только текст без форматирования. Второй формат это полный экспорт, при котором в поток будут передоватся ваши новости с сохранением полного форматирования и стилистики, т.е. как это было раньше. И последний формат экспорта, это передача ваших новостей в соответствии со спецификацией формата Яндекс новости, т.е. поток будет полностью соответствовать требованиям Яндекса, если вы хотите транслировать свои новости на их сайт.
9. Добавлено кеширование RSS экспорта, тем самым снижена нагрузка на MySQL сервер, т.к. этот модуль не использует запросов к MySQL серверу.
10. В связи с приобретением лицензии на одну очень интересную разработку (http://vikjavev.no/highslide/) было полностью изменено отображение оригинальной копии загруженного на сайт изображения. Отображение картинок производится в одном окне браузера, путем плавного увеличения. Пример вы можете посмотреть в этой новости, кликнув на уменьшенные копии загруженных изображений. В связи с тем что все новости хранятся в базе данных уже готовом, сформированном формате, то новая технология будет использоватся только в новых добавленных новостях. Если вы просто отредактируете старую новость, картинки в них будут увеличиваться также с использованием новой технологии.
11. Изменено отображение всплавающего окна уведомления о получении новых персональных сообщений. При отображении уведомления используются мягкие тени, работающие во всех браузерах.
12. Добавлена возможность при загрузке изображений на сервер, также вставить по одному клику оригинальное изображение, если для этого изображения была создана уменьшенная копия.
13. В модуль поиска добавлена возможность поиска определенного текста во всех комментариях. Кто не в курсе, то раньше поиск производился только в комментариях зарегистрированных пользователей.
14. Улучшена стабильность скрипта на некоторых NT системах.
15. Существенно расширена общая статистика сайта. Добавлен вывод количества опубликованных новостей за сутки, неделю, месяц (теги для шаблона stats.tpl {news_day}, {news_week}, {news_month} соответственно). Добавлен вывод количества добавленных комментариев за сутки, неделю, месяц (теги для шаблона stats.tpl {comm_day}, {comm_week}, {comm_month} соответственно). Добавлен вывод количества зарегистрированных пользователей за сутки, неделю, месяц (теги для шаблона stats.tpl {user_day}, {user_week}, {user_month} соответственно).
16. Добавлено кеширование модуля общей статистики сайта.
17. Добавлена автоматическая авторизация пользователей, после регистрации на сайте. Теперь после регистрации вашим посетителям не нужно вводить логин или пароль для входа на сайт, они будут автоматически распознаны скриптом.
18. Добавлена возможность автоматического создания бекапа вашей базы данных. Для функционирования данной возможности, необходима поддержка вашим хостером запуска приложений по CRON, это позволяет избежать нагрузки на сервер скриптом, а также вы можете самостояльно указать, когда создавать бекап базы данных и с какой периодичностью. Также вы можете указать количество одновременно хранимых на сервере резервных копий. Более старые копии БД будут автоматически удалятся.
19. Изменен принцип работы профиля пользователя. Теперь при просмотре профиля, в нем будут выводится только новости ожидающие модерации, и эти новости будут доступны для просмотра только их авторам и администраторам, для других пользователей, новости в профиле показыватся не будут. Но в данный шаблон добавлен тег {news} который выводит ссылку на просмотр всех опубликованных новостей данного пользователя. При переходе по данной ссылке будут показаны все новости пользователя, но уже без его профиля. Ссылка на просмотр всех новостей пользователя, опубликованных на сайте выглядит как http://site.ru/user/имя пользователя/news/
20. При нажатии ник автора новости добавлено удобное высплывающие меню, позволяющее перейти в его профиль, найти все его публикации, отправить персональное сообщение, а администраторы могут отредактировать его профиль.
21. Добавлена возможность указания в настройках скрипта краткого названия сайта, которое будет отображатся в модуле speedbar, вместо вашего основного названия сайта.
22. Изменен показ списка загруженных файлов в админпанели, если раньше после загрузки в списке показывалось количество скачиваний, то сейчас показывается размер файла. Иначе многие считали что 0 это размер и загрузка файла произошла со сбоем.
23. Добавлена возможность назначения собственного полностью отдельного от остальных шаблона для статических страниц.
24. Переработаны алгоритмы работы с RSS потоками, добавлена совместимость с последними версиями PHP 5.2.4 и выше (тем самым решена проблема возникновения ошибки: "XML error: not well-formed (invalid token)" на нормальных рабочих RSS потоках).
25. Переработан метод формирования ссылки на полную новость при включенном ЧПУ. Новый вид ссылки http://site.ru/категория/подкатегория/id-название новости.html Если новость не содержит категории то ссылка имеет вид http://site.ru/id-название новости.html. Благодаря новому формированию ссылки существенно снижается нагрузка на MySQL сервер, а также достигается лучшая поисковая оптимизация, т.к. при смене даты новости ее URL остается неизменным. Внимание новые ссылки формируются только для новых добавленных на сайт новостей, для старых новостей формируется старый вид ссылки, до тех пор пока вы неизмените дату у новости, тем самым полностью сохраняется поисковая оптимизация. Для примера вы можете посмотреть URL для данной новости на сайте http://dle-news.ru/ и URL более старых новостей.
26. Добавлена поддержка скриптом PHP версий 6.xx
27. Исправлена ошибка при которой происходила аварийная остановка загрузки файлов, если загружаемые файлы имели одинаковые имена.
28. Существенно сокращен траффик между БД MySQL и сервером, вследствии чего снижено потребление оперативной памяти и а также увеличена скорость работы скрипта.
29. Исправлены все обнаруженные и заявленные ранее небольшие ошибки в скрипте.
Русская разработка, полностью на русском языке. Сейчас доступна для скачивания стабильная версия 0.4. Распространяется под лицензией GNU GPL. PHP+MySQL.
Имеет:
- Управление новостями - создание, редактирование, удаление категорий(с правом доступа пользователям); создание, редактирование, удаление, вывод на печать новостей; поддержка комментариев(с правом доступа пользователям) смайлики, минимум встроенных тэгов; поддержка RSS лент для категорий и сводного вывода в стандарте RSS 2.0 и Yandex-news;
- Каталог файлов - создание, редактирование, удаление категорий (с правом доступа пользователям); создание, редактирование, удаление, возможность загрузки и скачивания файлов; поддержка комментариев и рейтинга; поддержка RSS лент аналогичная новостной;
- Каталог ссылок - создание, редактирование, удаление категорий; создание, редактирование, удаление, добавление баннеров, подсчёт переходов;
- Опросы - создание, редактирование, удаление, лимитирование времени проведения опросов; поддержка комментариев;
- Мод статей - ручное клонирование; создание, редактирование, удаление категорий(с правом доступа пользователям); создание, редактирование, удаление, прикрепление файла, вывод на печать статьи; поддержка комментариев;
- А так же - шаблоны оформления; создание, редактирование, удаление статических страниц; обратная связь; интеграция с форумами; и многое другое...
Реляционная система управления базами данных MySQL разработана и до сих пор поддерживается шведской компанией MySQL AB. На сегодняшний день MySQL - одна из самых распространенных СУБД с открытыми исходными кодами. Это означает, что за рядом мелких исключений ей можно пользоваться бесплатно, а кроме того, модифицировать исходный код, который доступен в сети Internet.
В данной книге рассматривается установка MySQL в операционных системах Windows, Linux, Mac OS; подробно описываются запуск СУБД и работа с ней, причем основное внимание уделяется доступу к базе данных и администрированию из командной строки. Ряд глав посвящен программированию на языках PHP, Perl и Java. В тексте приводятся упражнения облегчающие изучение MySQL начинающими пользователями.
В приложениях рассматриваются вопросы диагностики и устранения ошибок, приводятся справочная информация и ссылки на другие источники.
Данная книга поможет вам в кратчайшие сроки освоить SQL — самый популярный язык баз данных. Начиная с простых запросов на выборку данных, автор урок за уроком рассматривает все более сложные темы, такие как использование операций объединения, подзапросы, хранимые процедуры, индексы, триггеры и ограничения. На изучение материала каждого урока вам потребуется не более 10 минут. Благодаря этой книге вы быстро научитесь самостоятельно составлять запросы к базам данных на языке SQL без чьей-либо помощи.
Примеры, приведенные в книге, будут работать во всех наиболее популярных СУБД — IBM DB2, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL и Sybase Adaptive Server.
Книга известного профессионала в области баз данных посвящена новым версиям самой популярной в настоящее время базы данных, рассчитанной на широкий круг пользователей - MySQL. Подробно рассматриваются такие вопросы, как установка и конфигурирование MySQL, выполнение повседневных задач и улучшение производительности. На примере тестовых баз данных он приводит решения проблем, с которыми читатель обязательно должен столкнуться при практическом использовании реляционной СУБД MySQL. Читатель получит навыки интеграции MySQL с такими программными средствами, разработанными сторонними компаниями, как компиляторы языков PHP и Perl, позволяющими создавать с помощью запросов к базе данных динамические Web-страницы. Кроме того, здесь приведен обширный справочный материал, посвященный таким темам, как типы столбцов, операторы, функции, синтаксические конструкции языка SQL, интерфейсам C API, Perl DBI и PHP API. В книге уделено особое внимание доработкам и дополнениям, появившимся в версиях 4.1 и 5.0.
Книга рассчитана на пользователей, администраторов и разработчиков систем клиент/сервер на основе MySQL.
Вы держите в руках книгу, которая поможет вам научиться программировать на PHP и создвать базы данных на MySQL. Если вашей целью является написание программ для веб-серверов, то эта книга для вас. Вы узнаете все основные концепции языков программирования, в частности, изучите команды и синтаксис языка PHP. Вы также узнаете, как в современных средах используются данные, кроме всего этого, также обучитесь самому процессу программирования. PHP - это мощный язык программирования, который позволяет создавать динамические веб-сайты. Он хорошо работает на разнообразных платформах и весьма доступен для понимания. MySQL является впечатляющей системой управления реляционными данными, используемой для создания высококачественных коммерческих баз данных. PHP и MySQL являются настолько мощными и простыми в использовании платформами, что их использование позволяет заниматься веб-программированием даже новичкам.
В данной книге описана программа MySQL версии 3.23 — самый последний стабильный выпуск, доступный на момент написания книги. Сначала излагаются основы MySQL: запросы, модели баз данных, вопросы нормализации и организации многопользовательской работы, а также транзакции. Затем систематически анализируются все ключевые аспекты программы и демонстрируются эффективные методики взаимодействия с базами данных MySQL посредством языков С, Java, PHP, Perl, Python и др.
Данная книга дает профессионалам именно то, что они ищут: авторитетное, подробное, богатое примерами руководство по разработке приложений MySQL корпоративного уровня.
От автора: В этом описании рассматривается СУБД MySQL. Руководство рассчитано на пользователей среднего уровня подготовки. Оно может быть использовано как в качестве справочного руководства по данной СУБД, так и в качестве учебника. В целях его использования в качестве справочника, в самом начале документа предусмотрено полное оглавление.
ЭТО НЕ ПЕРЕВОД ОРИГИНАЛЬНОЙ ДОКУМЕНТАЦИИ! Этот документ написан после прочтения фирменной документации, работы с пакетом и даже попыток его повалить, правда, не слишком удачных. Таким образом, в документе нашлось место и для личного мнения автора по ряду вопросов. Этот абзац мне пришлось включить на основании опыта подготовки подобной документации. Увы, описания, выстраданные кропотливым изучением программ, посчитали примитивным переводом, что говорит о том, что с ними просто не ознакомились должным образом. Я не отрицаю изучения мной оригинальной документации на пакет, но этот документ переводом не является.
Данная книга является превосходным учебным пособием, позволяющим быстро освоить и эффективно использовать PHP. Здесь Вы найдете все, что для этого необходимо: от описания настройки PHP, основ CGI и базовых конструкций языка до работы с сессиями, каналами, сокетами и другими специальными технологиями PHP. Особое место занимает рассмотрение взаимодействие PHP с базами данных. В книге рассмотрены какMySQL, так и SQLite, поддерживаемая PHP5.
Этот документ создан на основе компиляции нескольких документов, а также на основе перевода с английского страниц-учебников, которые в обилии можна встретить на многочисленных Web-узлах в Интернете, посвященных программированию на PHP и связи его с MySQL.
Данный труд не ставит целью заменить собой мануалы по PHP и MySQL. Дело в том, что большинство материалов, в том числе и руководства к данным программным продуктам пока распространяются на английском языке. Качественные пособия на русском языке встречаются редко.
Данный букварь просто поможет Вам сделать первые шаги в изучении PHP и способах взаимодействия его с БД MySQL. В этой книге Вы найдете ответы на свои основные вопросы.
Вы держите в руках книгу, которая поможет вам научиться программировать на PHP и создавать базы данных при помощи MySQL. Если вашей целью является написание программ для веб-серверов, то эта книга для вас. Вы узнаете все основные концепции языков программирования, в частности, изучите команды и синтаксис языка PHP. Вы также узнаете, как в современных средах используются данные и кроме всего этого обучитесь также самому процессу программирования. PHP и MySQL являются настолько мощными и простыми в использовании платформами, что позволяют заниматься веб-программированием даже новичкам.
Многие мои друзья и знакомые часто спрашивают меня о том, как устроен мой сайт, сколько у меня таблиц в базе данных, как я храню данные и по каким полям веду поиск. Я, конечно, не выдаю все свои государственные тайны, но всегда понимаю причину таких вопросов и пытаюсь помочь людям построить быструю и надежную базу данных - т.е. тщательно продумать структуру БД таким образом, чтобы при увеличении нагрузки или объема таблиц динамический веб-сайт не превратился в тормозное усмертие.
А ведь многие новички (веб-строители) даже не догадываются о том, что крупные динамические сайты тормозят вовсе не из-за нагрузки скриптов на процессор, а в основном из-за неоптимизированного или дохленького MySQL-сервера. При этом во многом все зависит от того, как устроена ваша база данных.
Итак, начнем ликбез. Сразу всем вопрос: что делает MySQL во время записи в таблицы типа INSERT или UPDATE? Правильно - БЛОКИРУЕТ ТАБЛИЦЫ и пишет в них данные. Скорость записи и поиска может быть достаточно низкой, поэтому статус таблиц запрещает другим процессам считывать из них данные до окончания операции записи или обновления и снятия блокировки. При этом может получиться так, что во время записи единственного поля в длинные таблицы, ваш MySQL-сервер надолго заблокирует доступ к таблице остальным скриптам.
Например, вы создали таблицу новостей такого типа:
ID - номер, первичный ключ TEMA - тема новости MESS - сообщение, сама новость VIEWS - количество просмотров
При каждом обращении к новостям, скрипт будет выводить саму новость, а потом увеличивать поле VIEWS запросом UPDATE table 'NEWS' set VIEWS=VIEWS+1 where id=ID. При этом количество апдейтов будет довольно высоким. При высокой посещаемости веб-ресурса или при "нападении" на сайт поискового робота (эти ребята страдают многопоточностью и могут запросто повесить ваш сайт своими запросами) несколько одновременных процессов станут пытаться сделать UPDATE и SELECT. При каждом UPDATE таблица будет блокироваться (на это уходит время) и все остальные процессы будут ждать завершения операции. А если таблица достаточно большая? Например, несколько тысяч записей. Ежу понятно, что построится очередь из нескольких десятков скриптов, ожидающих ответа MySQL-сервера. Каждый будет жрать память и держать остальные процессы. В итоге все у вас зависнет и переглючит. Выход: делать вместо одной таблицы несколько. Советую разделять поля по типу их использования. Одну таблицу - только для вывода и редких обновлений или вставок. Другую - для частых обновлений, но редкого вывода. Например, значения счетчика обращений держать отдельно в таблицу вида:
ID - номер, первичный ключ VIEWS - количество просмотров
Сами новости лучше держать в другой таблице, где нет поля VIEWS. При этом таблица с новостями будет тяжелой (много текста, полей, индексов), а таблица COUNT (счетчик) будет очень легкой и быстрой. Таблица NEWS будет кешироваться и выводиться очень быстро при любых объемах, а таблица COUNT будет быстро обновляться из-за того, что она очень легкая (всего два целочисленных поля). Разделение данных по нескольким таблицам существенно ускоряет работу MySQL-сервера. Гораздо быстрее работают несколько мелких запросов по каждой таблице, чем один длинный запрос по одной или нескольким таблицам. Имейте это в виду, чтобы спать спокойно.
Дальше - круче. Чтобы не блокировать лишний раз свои таблицы используйте при вставках директиву DELAYED. Пример: INSERT DELAYED into STAT (ID,IP,UTIME) values (null,$ip,NOW()). Он позволяет серверу ответвлять поток в режиме ожидания, а саму вставку производить тогда, когда сервер освободится от других запросов или поступит следующий аналогичный INSERT DELAYED. Обычно отложенный метод подходит для любых операций с кумулятивными таблицами (когда в основном идут INSERTы, а данные копятся, а не модифицируются), при которых не особо важно когда именно подействуют изменения - мгновенно или через несколько секунд, минут. Например, если хотите собирать IPадреса своих посетителей, УРЛы, по которым они ходят или страницы, откуда пришли, время. При добавлении с задержкой скрипт отработает почти мгновенно, еще до выполнения операции.
Операция UPDATE идет в три этапа: поиск того, что будете менять, затем запись данных, обновление индексов. При этом, чем больше таблица, тем дольше поиск. Если есть индексы, то операция кешируется и выполняется достаточно быстро. Но сам процесс очень емкий. И только дурак не догонит, что большая таблица со множеством индексов и записей, будет тормозить при UPDATE. INSERT же выполняется одним залпом, очень быстро. Поэтому обычно используют аддитивные записи (вставками INSERT) во временные таблицы, потом блокируют основные талицы, суммируют обновления, и плюют их в основную таблицу. Получается, что в основном, главные таблицы работают только в режиме вывода, а обновления идут гораздо реже и быстрее. Например, можно копить данные о загрузках новостей во временной таблице, а по крону или иным образом обновлять счетчик каждые 10 минут (или реже). Это ускорит работу сервера.
При запросах SELECT * FROM таблица скрипт получит все поля данной таблицы. А нужно ли это? Использование * ведет к лишнему расходу ресурсов. Гораздо эффективнее использовать точные названия полей, которые нужны скрипту. Например: SELECT id,name FROM таблица. При таком запросе передача займет меньше времени и понадобится меньше ресурсов. Старайтесь ограничивать вывод при помощи директивы LIMIT. Это также ускоряет вывод.
Поиск по БД идет быстрее если вместо LIKE '%слово%', ставить 'слово%'. Операции с шаблонами регулярных выражений кешируются только в том случае, если в начале отсутствует символ %. Поэтому при построении поисковых запросов с LIKE избегайте начинающих символов %.
При построении таблиц для наиболее используемых полей (при поиске, сортировке и т.д.) обязательно создавайте индексы. Без индексов таблицы будут сильно тормозить. Индексы служат для кеширования и позволяют существенно ускорить вывод данных из таблиц. При этом таблицы будут занимать больше места на диске и в памяти. Но это в наше время не проблема.
Используйте надлежащий тип полей для своих записей. Тип TINYINT занимает 1 байт - самый быстрый. Таблицы с MEDIUMINT быстрее таблиц с INT. Если ставить полям свойство NOT NULL, то в целом их работа будет быстрее. VARCHAR медленее CHAR, поэтому таблицы переменной длины (где есть тип VARCHAR или TEXT) занимают меньше дискового пространства, но работают медленнее.
По своему опыту скажу, что для большинства сайтов подходят изложенные советы по работе с MySQL. Чтобы еще больше ускорить свой сервер, советую частоиспользуемые операции проводить по крону выделенными процессами и писать данные в различные файлы. Например, раз в 20 минут запускать скрипт, который будет создавать файл с новостями. Или например, генерить файл с новостями при их добавлениях или обновлениях. Таким образом, вы экономите на каждом обращении к БД. Интерактивность при этом не теряется, а производительность увеличивается во много раз. Особенно, повторяю, при высокой посещаемости ресурса. Старайтесь отделить интерактивные операции от фоновых. Например, на ПротоПлексе работает один интерактивный движок, но в фоне по заданиям трудятся с десяток различных роботов, которые генерируют часто вызываемые страницы, рассылают письма и т.д. Крупный сайт - это не только то, что вы видите, но и бек-енд (обратная сторона). В фоновом режиме можно быстро и эффективно готовить контент, освобождая основной движок от лишней работы.
В общем, основы должны быть всем понятны. Дробите все на мелочи, будь то запросы, таблицы или операции. Структура БД должна быть такой, чтобы не выполнялось ничего лишнего. Регулярно проводите OPTIMIZE на таблицах с переменной длиной, особенно, если в них идут удаления записей. Тестируйте свои запросы на скорость, упрощайте их.
Позволю себе предоставить на конструктивный суд общественности список хорошо зарекомендовавших себя архитектурных решений и практик. Сегодня поговорим о базах данных MySQL.
Повелитель CHAR
Если есть возможность, используем поле CHAR для текстовых полей. И искать будет быстрее, и защита от дурака будет. Так, например, для MD5-хэша пароля это CHAR(32), для тикера валюты (USD, EUR) – CHAR(3). Есть ещё масса примеров: если ваше приложение работает с данными по аэропортам, то кандидатом на тип CHAR будет ICAO-код аэропорта (4 символа) или IATA-код (3 символа), если с банками, то код BIC.
Приручаем TIMESTAMP
Часто требуется хранить дату создания и/или модификации сущности (поля stamp_created и stamp_updated). Не все пользуются фреймворками типа Symfony, где система сама отвечает за их наполнение — и так как порой их актуальность обеспечивается вручную, были случаи, когда эти поля оставались просто пустыми — некогда было возиться. Можно объявить поле так, что этот функционал будет работать сам. Правда, в случае MySQL придётся выбирать: автоматически будет работать либо дата создания, либо дата модификации. Для этого нужно создать поле типа TIMESTAMP; в первом случае (created) указываем инициализацию текущим временем, во втором (updated) — указываем авто-обновление поля при каждой модификации текущей записи. Оба варианта умеет делать PHPMyAdmin.
Каскады FOREIGN KEY
Конечно, это касается не только MySQL. Удаление данных в иерархии сущностей можно автоматизировать с помощью каскадного удаления FOREIGN KEY (да, это банально, но часто на это кладут). Например, у меня в Rival Alert есть пользователи, у пользователей есть графики, у графиков есть данные. Без FOREIGN KEY функция удаления пользователя должна сначала удалить все данные по графикам этого пользователя, потом все его графики, и только потом — самого юзера. При использовании FOREIGN KEY вся соответствующая информация удалится сама, причем логикой на стороне сервера БД, и без дополнительных запросов от сервера приложений.
Кстати, FOREIGN KEY поддерживаются только в InnoDB-движке. Перейдя на него, вы получите возможность использовать транзакции, но потеряете полно-текстовый поиск (он в MyISAM).
Есть ещё идейка, которую держу про запас. В той же “Building Scalable Web Sites” пишут, что для ускорения работы приложения базу данных можно немножко де-нормализовать, например, рейтинги статей считать не налету на каждый запрос, а держать в отдельном поле таблицы статей уже в посчитанном виде и время от времени обновлять, ну или скажем вам нужно дублировать название/ссылку статьи в каждой записи рейтинга. Так вот идейка состоит в том, чтобы использовать CASCADE UPDATE для обновления полей в зависимой таблице — тогда целостность данных при такой денормализации будет выше.
INSERT + UPDATE в одном запросе
Частый кейс: если нет такого записи — вставить (INSERT), если есть — обновить для неё пару полей (UPDATE). Часто это решается через предварительный SELECT, чтобы установить факт наличия такой записи. Можно сделать это одним запросом, лишь бы был PRIMARY KEY или UNIQUE KEY.
Приведу пример. В том же Rival Alert у меня у одного графика за один день может быть только одно значение (такое вот условие). Сколько раз в базу будет класться это значение — не важно. Так вот, если значения “за сегодня” нет — мы его добавляем, если есть — обновляем (в поле `date` хранится текущая дата; пара `id_graph`+`date` — уникальна для каждой записи, что было указано через UNIQUE при создании таблицы).
Кстати, чтобы запрос стал красивее, и вам не нужно было два раза указывать значение вставки/обновления (в моём примере — это 4444), можно в разделе UPDATE указать, что нужно взять значение из раздела INSERT:
Оба запроса делают то же самое, только теперь вам нужно будет лишь в одном месте подставлять фактическое значение, а не в нескольких.
И последнее. Если вам нужно работать по сути с одними и теми же данными, но из разных баз данных, посмотрите в сторону Federated Storage Engine. Полезно иметь такую фичу на примете.
Надеюсь, эта заметка поможет вам кода писать меньше, а успевать больше.