Статьи

Топ-10 ошибок MySQL, допущенных разработчиками PHP

Узнайте больше о MySQL с нашей заставкой MySQL в командной строке .

База данных является фундаментальным компонентом для большинства веб-приложений. Если вы используете PHP, вы, вероятно, используете MySQL — неотъемлемую часть стека LAMP.

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

1. Использование MyISAM вместо InnoDB

MySQL имеет несколько механизмов баз данных, но вы, скорее всего, столкнетесь с MyISAM и InnoDB .

MyISAM используется по умолчанию. Однако, если вы не создаете очень простую или экспериментальную базу данных, это почти наверняка неправильный выбор! MyISAM не поддерживает ограничения внешнего ключа или транзакции, которые важны для целостности данных. Кроме того, вся таблица блокируется всякий раз, когда запись вставляется или обновляется; это вызывает пагубное влияние на производительность по мере роста использования.

Решение простое: используйте InnoDB.

2. Использование PHP-функций mysql

PHP предоставляет функции библиотеки MySQL с первого дня (или почти не имеет значения). Многие приложения используют mysql_connect, mysql_query, mysql_fetch_assoc и т. Д., Но в руководстве по PHP говорится :

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

mysqli, или улучшенное расширение MySQL, имеет несколько преимуществ:

  • (необязательный) объектно-ориентированный интерфейс
  • подготовленные операторы (которые помогают предотвратить атаки с использованием SQL-инъекций и повысить производительность)
  • множественные выписки и поддержка транзакций

Кроме того, вы должны рассмотреть PDO, если вы хотите поддерживать несколько баз данных.

3. Не дезинфицировать пользовательский ввод

Вероятно, это должно быть № 1: никогда не доверяйте вводу пользователя . Проверяйте каждую строку, используя серверный PHP — не полагайтесь на JavaScript. Простейшие SQL-инъекции зависят от кода, такого как:

$username = $_POST["name"]; $password = $_POST["password"]; $sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';"; // run query... 

Это можно взломать, введя « admin'; -- admin'; -- »в поле имени пользователя. Строка SQL будет равна:

 SELECT userid FROM usertable WHERE username='admin'; 

Коварный взломщик может войти как «администратор»; им не нужно знать пароль, потому что он закомментирован из SQL.

4. Не использовать UTF-8

Те из нас, кто живет в США, Великобритании и Австралии, редко рассматривают языки, кроме английского. Мы с радостью заканчиваем наш шедевр только для того, чтобы обнаружить, что его нельзя использовать в другом месте.

UTF-8 решает многие проблемы интернационализации. Хотя это не будет должным образом поддерживаться в PHP до версии 6.0, мало что может помешать вам установить MySQL для UTF-8

5. Любить PHP над SQL

Когда вы новичок в MySQL, заманчиво решать проблемы на языке, который вы знаете. Это может привести к ненужному и медленному коду. Например, вместо использования встроенной функции MySQL AVG () , вы используете цикл PHP для вычисления среднего значения путем суммирования всех значений в наборе записей.

Также следите за запросами SQL внутри циклов PHP. Как правило, более эффективно выполнить запрос, а затем просмотреть результаты.

В общем, используйте сильные стороны вашей базы данных при анализе данных. Небольшое знание SQL имеет большое значение.

6. Не оптимизировать ваши запросы

99% проблем с производительностью PHP будет вызвано базой данных, и один неверный SQL-запрос может нанести ущерб вашему веб-приложению. Оператор MySQL EXPLAIN , Query Profiler и многие другие инструменты могут помочь вам найти этот мошеннический SELECT.

7. Использование неправильных типов данных

MySQL предлагает ряд числовых, строковых и временных типов данных . Если вы сохраняете дату, используйте поле DATE или DATETIME. Использование INTEGER или STRING может сделать запросы SQL более сложными, если не невозможными.

Часто бывает заманчиво изобрести свои собственные форматы данных; например, хранение сериализованных объектов PHP в строке. Управление базой данных может быть проще, но MySQL станет тупым хранилищем данных, и это может привести к проблемам позже.

8. Использование * в запросах SELECT

Никогда не используйте *, чтобы вернуть все столбцы в таблице — это лениво. Вы должны извлечь только те данные, которые вам нужны. Даже если вам требуется каждое поле, ваши таблицы неизбежно изменятся.

9. Недостаточная или чрезмерная индексация

Как правило, индексы должны применяться к любому столбцу, указанному в предложении WHERE запроса SELECT.

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

Заманчиво добавлять индексы в каждый столбец, однако они создаются заново во время каждой таблицы INSERT или UPDATE. Это может повлиять на производительность; добавляйте индексы только при необходимости.

10. Забыть резервное копирование

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

11. Бонусная ошибка: без учета других баз данных!

MySQL может быть наиболее широко используемой базой данных для разработчиков PHP, но это не единственный вариант. PostgreSQL и Firebird являются его ближайшими конкурентами; оба с открытым исходным кодом и не контролируются корпорацией. Microsoft предоставляет SQL Server Express, а Oracle — 10g Express ; обе являются бесплатными версиями крупных корпоративных версий. Даже SQLite может быть жизнеспособной альтернативой для небольших или встроенных приложений.

Я пропустил ваши худшие ошибки MySQL?

Узнайте больше о MySQL с нашей заставкой MySQL в командной строке .