RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 2. Рекомендации для разработчиков

Следующие рекомендации касаются аспектов разработки приложений MySQL, которые не могли бы быть немедленно очевидны для разработчиков, происходящих из среды Python:

  • Для безопасности не кодируйте явно значения для соединения с базой данных в вашем главном скрипте. Python имеет config.py, где можно отделить такие значения от остальной части кода.

  • Скрипты Python часто растут и сносят большие структуры данных в памяти до пределов доступной RAM. Поскольку MySQL часто имеет дело с наборами данных, которые во много раз больше, чем доступная память, методы, которые оптимизируют пространство памяти и дисковый ввод-вывод, особенно важны. Например, в таблицах MySQL, вы, как правило, используете числовые ID, а не основанные на операциях со строками ключи словаря, так, чтобы значения ключа были компактны и имели предсказуемую длину. Это особенно важно для столбцов, которые составляют primary key для таблиц InnoDB, потому что те значения столбцов дублированы в каждом secondary index.

  • Любое приложение, которое принимает ввод, должно ожидать обрабатывать неправильные данные.

    Неправильные данные могли бы быть случайными, такими как значения не из диапазона или неформатированные последовательности. Приложение может использовать проверки серверной стороны, такие как unique constraints и NOT NULL constraints, чтобы удержать неправильные данные от достижения базы данных когда-либо. На клиентской стороне используйте такие методы, как обработчики исключений, чтобы сообщить о любых проблемах и принять меры по ликвидации последствий.

    Неправильные данные могли бы также быть преднамеренными, представляя SQL injection. Например, входные значения могли бы содержать кавычки, точки с запятой, символы подстановки % и _ и другие знаки, значительные в SQL-операторах. Проверьте входные значения, чтобы удостовериться, что у них есть только ожидаемые знаки. Экранируйте любые специальные символы, которые могут изменить намеченное поведение, когда подставлены в SQL-оператор. Никогда не связывайте значение ввода данных пользователем в SQL-оператор, не делая проверки и экранировки. Даже когда ввод произведен некоторой другой программой, ожидайте, что другая программа, возможно, также подставилась под угрозу и посылает вам неправильные или злонамеренные данные.

  • Поскольку наборы результатов от SQL-запросов могут быть очень большими, используйте соответствующий метод, чтобы получить элементы набора результатов, поскольку вы образовываете циклы. fetchone() получает единственный элемент, когда вы знаете, что набор результатов содержит единственную строку. fetchall() получает все элементы, когда вы знаете, что набор результатов содержит ограниченное количество строк. fetchmany() является методом общего назначения, когда вы не можете предсказать размер набора результатов: вы продолжаете вызывать его и получать возвращенные элементы, пока больше не останется результатов.

  • Так как у Python уже есть удобные модули, например, pickle и cPickle, чтобы прочитать и написать структуры данных на диске, у данных, которые вы принимаете решение хранить в MySQL вместо этого, вероятно, будут специальные особенности:

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

    • Слишком сложно, чтобы быть представленным единственной структурой данных. Вы делите данные между различными таблицами SQL. Можно повторно объединить данные из многих таблиц при помощи запроса join. Вы удостоверяетесь, что связанные данные сохранены в синхронизации между различными таблицами, настроив отношения foreign key.

    • Обновляются часто, возможно многочисленными пользователями одновременно. Обновления могли бы затронуть только небольшую часть данных, делая расточительным писать целую структуру каждый раз. Вы используете SQL-запросы INSERT, UPDATE и DELETE, чтобы обновить различные элементы одновременно. Вы используете таблицы InnoDB и транзакции, чтобы помешать операциям записи находиться в противоречии друг с другом и возвращать последовательные результаты запроса, как раз когда основные данные обновляются.

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

  • Можно избежать проблем, изучив SQL-операторы MySQL для общих операций: операторы, чтобы использовать в запросах, методы для оптовых загрузок данных и так далее. Некоторые запросы это расширения к основным, определенным стандартом SQL. См. Data Manipulation Statements, Data Definition Statements, and SELECT Statement для главных классов запросов.

  • Выполнение SQL-операторов от Python, как правило, включает объявление очень длинных, возможно многострочных строковых литералов. Поскольку строковые литералы в SQL-операторах могут быть заключены в одиночные кавычки, двойные кавычки или содержать любой из этих знаков для простоты, можно использовать механизм Python's triple-quoting. Например:

    '''It doesn't matter if this string contains 'single'
    or "double" quotes, as long as there
    aren't 3 in a row.'''
    

    Можно использовать любой из символов ' или " для многострочных строковых литералов.

  • Многие секреты быстрого и масштабируемого применения MySQL включают использование правильного синтаксиса в самом начале вашей работы, в запросе CREATE TABLE. Например, Oracle рекомендует ENGINE=INNODB для большинства таблиц и делает InnoDB механизмом хранения по умолчанию в MySQL 5.5 и выше. Применение таблиц типа InnoDB позволяет транзакционное поведение, которое помогает масштабируемость нагрузки и предлагает автоматическое восстановление. Другая рекомендация состоит в том, чтобы объявить числовой primary key для каждой таблицы, который предлагает самый быстрый способ искать значения и может действовать как указатель на присваиваемые значения в других таблицах (foreign key). Также в CREATE TABLE использование самых компактных типов данных, которые удовлетворяют ваши требования к приложению, помогает работе и масштабируемости, потому что это позволяет серверу базы данных переместить меньше данных между памятью и диском.

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru