Как лучше организовать базу данных в mysql? планируется что база будет большая, и запросов будет много и нагрузка будет расти, что лучше делать одну большую таблицу и пихать по максимуму в нее инфу, или дробить узко направлено на мелкие таблички? интересно с точки зрения скорости обработки , нагрузки на сервер, и возможно безопасности инфы например стоит ли инфу какую дублировать в двух таблицах или не стоит это делать ? сейчас ситуация такая, мне надо например куда-то впихнуть права доступа к разному функционалу (специфическому не доступному большинству) вот я и думаю сделать отдельную таблицу, или сделать столбец дополнительный в той что есть ?
и еще вопрос про дублирование и безопасность, стоит дублировать инфу связанную например с бух учетом ? например в одну таблицу доступ только клиентов а в другую с другим набором инфы доступ персонала ? например бухгалтеров? или не надо эти дубли и все делать в одной таблице и не плодить дубли ?
Так же буду рад любым советам по вопросу оптимизации php и mysql
Используте ORM Используя ORM, можно получить определенную оптимизацию работы. Все, что можно сделать с помощью ORM, можно сделать и вручную. Но это требует дополнительной работы и более высокого уровня знаний. ORM замечателен для «ленивой» загрузки данных. Это означает выборку данных по мере необходимости. Но необходимо быть осторожным, т.к это может привести к появлению множества маленьких запросов, что приведет к снижению производительности. ORM также может объединять несколько запросов в пакеты, вместо отправки каждого отдельно. Моя любимая ORM для PHP — Doctrine. Я уже писал статью об установке Doctrine в CodeIgniter.
Будьте осторожны с постоянными соединениями Постоянные соединения предназначены для уменьшения расходов на установление связи с MySQL. Когда соединение создается, оно остается открытым после завершения работы скрипта. В следующий раз, этот скрипт воспользуется этим же соединением.mysql_pconnect() в PHPНо это звучит хорошо только в теории. Из моего личного опыта (и опыта других), использование этой возможности не оправдывается. У вас будут серьезные проблемы с ограничением по числу подключений, памятью и так далее. Apache создает много параллельных потоков. Это основная причина, почему постоянные соединения не работаю так хорошо, как бы хотелось. Перед использованием mysql_pconnect() посоветуйтесь с вашим сисадмином.
В MySQL можно использовать разные типы таблиц, наиболее распространены MyISAM и InnoDB.
MyISAM используется по умолчанию. Однако, скорее всего это не правильный выбор! MyISAM не поддерживает внешние ключи и транзакции, очень важны для сохранения целостности данных. К тому же, при создании новой записи или редактировании старой, блокируется вся таблица, что может нехорошо сказаться на производительности.
Использование функций mysql вместо mysqli - ошибка
PHP предоставляет функции библиотеки MySQL с самого начала (или почти с самого, не важно). Многие приложения используют mysql_connect, mysql_query, mysql_fetch_assoc и т.д., но что написано в мануале PHP:
"If you are using MySQL versions 4.1.3 or later it is strongly recommended that you use the mysqli extension instead."
mysqli, другая библиотека для работы с MySQL (MySQL improved - улучшенная работа с MySQL), имеет следующие преимущества:
MySQL предлагает широкий выбор типов данных: строки, числа, время. Если хотите хранить дату используйте тип DATE или DATETIME. Использование STRING вместо INTEGER сделает запросы более сложными, а иногда и вовсе невыполнимыми.
Часто кажется заманчивым использовать новый формат данных, например, сериализовать PHP объект в строку и сохранить. Хорошо подумайте, так ли это необходимо, и не будет ли потом проблем с кодом и базой.
Если вы только начинаете работать с MySQL, очень заманчиво использовать возможности языка программирования для решения каких-либо возникающих проблем. Это может привести к ненужному и медленному коду. Например, вместо использования цикла на PHP для расчета среднего значения, нужно воспользоваться функцией MySQL avg().
Так же не стоит делать запросы в цикле. Более эффективно сделать запрос и пройтись результату циклом.
В общем, используйте сильные стороны базы данных. Знание SQL сильно поможет в этом.
еще одна ошибка - Недостаточное или избыточное индексирование
Общее правило - индексы должны быть созданы на все поля использующиеся в WHERE и JOIN.
К примеру, у нас есть таблица пользователей с полями id (первичный ключ) и email. При входе в систему, MySQL должен найти id соответствующий введенному email. При использовании индекса, MySQL может применить быстрый алгоритм поиска, выдав результат почти мгновенно. Без индекса будет проходиться вся таблица, пока не найдется нужная запись.
Заманчиво добавить индекс к каждой колонке, но они генерируются заново при каждой операции INSERT и UPDATE. Это скажется на производительности; добавляйте индексы только там где они нужны.
MySQL наиболее широко используемая PHP-разработчиками база данных, но это ведь не единственный вариант. PostgreSQL и Firebird - ближайшие конкуренты MySQL: и та и другая open-source и развиваются сообществом разработчиков. Microsoft предоставляет SQL Server Express, Oracle - 10g Express, оба продукта имеют бесплатную версию. Для маленьких или встраиваемых приложений может быть использована SQLite.