MySQL: особенности и сферы применения. Подключение к серверу MySQL


Каждый, кто поставил перед собой цель освоить веб-технологии рано или поздно нужно будет освоить язык SQL - язык структурированных запросов, применяемый для создания и управления данными в реляционных базах данных. Если говорить о современном веб-приложении, то сегодня практически каждое приложение взаимодействует с СУБД - система управления базой данных.

Самое популярное СУБД для работы с веб-приложениями - MySQL. Сегодня практически все веб-сайты, которые работают в сети взаимодействуют с СУБД MySQL. Конечно MySQL не единственное СУБД, есть ряд других, но сложилось так, что самое популярное. Поэтому разработчикам веб-приложений необходимо освоить СУБД MySQL и язык SQL.

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

Выберите, одну толковую книгу по изучении MySQL. Сосредоточьтесь на этой книге, прочтите ее, закрепите каждую главу на практике. Если, что-то слабо усвоилось, практикуйтесь, не бойтесь вернуться и еще несколько раз прочитать и сделать. Рекомендую прочесть книгу Алана Бьюли «Изучаем SQL», лично мне эта книга очень помогла. Книга написана простым языком, для простых людей в книге доступным языком описывается как установить сервер MySQL, как работают операторы, фильтры и т.д. Подробнее об этой книге читайте .

Если нету еще навыков работы с MySQL, нету понимания типов данных и операторов SQL, не рекомендую начинать осваивать в phpMyAdmin. Это не значить, что phpMyAdmin - плохо. Главная задача освоить SQL и MySQL - лучше делать через консольное приложение.

Скачайте с официального сайта бесплатно сервер MySQL, установите его себе на компьютер и работайте. Например: если взять книгу Алана Бьюли «Изучаем SQL» в ней подробный курс SQL и работа с MySQL, все примеры работы через консольное приложение.

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

Ваши инструменты : выбранная книга, сервер MySQL, практика, практика и еще раз практика.

Имея опыт работы через консольное приложение, разработчику не составить сложности работать в том же самом phpMyAdmin, ему не составит сложности писать все команды SQL. Это нужно и важно, потому, что управлять и создавать базу данных можно в phpMyAdmin толком и не зная SQL. Но помните SQL - запросы писать нужно будет при разработке веб-приложений, от этого не уйти.

Теги: sql, mysql, базы данных

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

Любой разработчик, работающий в среде PHP, способен самостоятельно администрировать базу данных MySQL, в отличие от некоторых других баз данных. Для того чтобы еще больше упростить задачу администрирования, можно воспользоваться многочисленными инструментальными средствами, которые не только предусмотрены в самой базе данных MySQL, но и могут быть получены от сторонних разработчиков.

Основными понятиями, с которыми следует ознакомиться на данном этапе, являются:

  • база данных - контейнер для всей коллекции данных MySQL;
  • таблица - вложенный в базу данных контейнер, в котором хранятся сами данные;
  • строка - отдельная запись, в которой могут содержаться несколько полей;
  • столбец - имя поля внутри строки.

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

Доступ к MySQL из командной строки

Работать с MySQL можно тремя основными способами: используя командную строку, используя веб-интерфейс наподобие phpMyAdmin и используя такой язык программирования, как PHP. Третий из перечисленных способов будет рассмотрен в последующих статьях, а сейчас давайте рассмотрим первые два способа.

Если у вас в соответствии с инструкциями, изложенными в статье , установлен WAMP-сервер OpenServer, то доступ к исполняемой программе MySQL можно получить из следующего каталога:

курса MySQL с нуля .

Вместо MySQL-5.7-x64 нужно подставить версию, указанную в настройках OpenServer во вкладке "Модули".

Нужно открыть программу "Командная строка" и перейти в этот каталог. Делается это при помощи команды cd ПУТЬ_К_НУЖНОЙ_ПАПКЕ:

Код доступен только после покупки курса MySQL с нуля .

После этого нужно запустить программу mysql.exe в этом каталоге, передав её специальный параметр. Для этого в командной строке теперь нужно выполнить команду:

Код доступен только после покупки курса MySQL с нуля .

В результате запустится MySQL-клиент. Он подключён к MySQL-серверу, который был запущен при старте OpenServer-a.

Если это не приведет к желаемому результату и будет выдано сообщение об ошибке подключения к серверу MySQL «Can"t connect to MySQL server on "localhost"», убедитесь, что OpenServer запущен и в модулях указан MySQL.

Параметр -u расшифровывается как user. То есть это флажок для указания пользователя, под которым нужно подключиться к серверу. root - это самый главный пользователь в MySQL. Он создаётся при установке сервера и по умолчанию у него нет пароля.

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

Код доступен только после покупки курса MySQL с нуля .

В ответ мы получим красиво оформленный список баз. У вас их будет меньше, чем у меня, потому что я их уже добавлял.

Работа с MySQL через phpMyAdmin

Для управления базами данных и таблицами будет намного проще и быстрее использовать программу phpMyAdmin. Перед тем как вводить в адресную строку браузера следующую строку, нужно убедиться в том, что программа OpenServer уже запущена и, значит, база данных MySQL готова к работе:

Тут нас встретит вот такое красивое окошечко для входа в систему.

Также как и в случае с консольным приложением указываем пользователя root и оставляем пустым пароль. Жмём "войти".

После этого вы попадёте в панель управления базами данных с довольно дружелюбным интерфейсом. Слева вы увидите всё тот же список баз данных, который вы получали в консольной версии. Можете по ним потыкать, посмотреть, что там внутри.

А сейчас давайте нажмём на вкладку SQL и перейдём в окно, где можно напрямую писать запросы к СУБД MySQL, как это было бы в консоли:

В открывшемся окне введите всё тот же запрос:

Код доступен только после покупки курса MySQL с нуля .

Нажимаем кнопку "вперёд" и видим тот же результат, что и в случае с консольным приложением.

Основные понятия языка SQL

По словам Эндрю Тейлора (Andrew Taylor), разработавшего язык SQL, название этого языка не является сокращением от Structured Query Language (или от чего-то подобного), хотя многие считают, что так оно и есть. Язык SQL лежит в основе более строгого и более общего метода хранения данных по сравнению с предыдущим стандартом организации баз данных в стиле DBM, который основан на использовании плоских файлов.

Язык SQL определен стандартами ANSI (American National Standards Institute) и ECMA (European Computer Manufacturer"s Association); обе эти организации по стандартизации являются международно признанными. Но следует учитывать, что в общих рекомендациях стандартов SQL наблюдаются заметные различия, касающиеся программных продуктов коммерческих компаний, с одной стороны, и организаций, занимающихся разработкой баз данных с открытым исходным кодом, с другой. Например, за последние несколько лет наблюдалось стремительное развитие так называемых объектно-реляционных баз данных, а также программных продуктов SQL, специально предназначенных для рынка веб. Перечень баз данных, которые могут применяться в сочетании с системой PHP, чрезвычайно велик, поэтому при выборе наиболее подходящей базы данных необходимо руководствоваться определенными принципами.

Основной принцип состоит в том, что нужно прежде всего учитывать собственные потребности разработки или по крайней мере твердо знать, какой цели требуется достичь. Пытаясь ознакомиться с другими рекомендациями, вы встретите массу весьма убедительных сообщении с такими доводами, что буквально "нельзя обойтись" без некоторых развитых средств базы данных (таких как триггеры или хранимые процедуры) и любой программный продукт с поддержкой SQL, в котором отсутствуют эти средства, вряд ли заслуживает права называться продуктом SQL. Воспринимайте эти суждения с большой долей сомнения. Гораздо лучше самому составить список требуемых характеристик в порядке значимости, а затем заняться поиском программного продукта, который в наибольшей степени соответствует вашим требованиям.

Но, несмотря на сказанное выше, значительная часть средств поддержки языка SQL действительно соответствует стандарту. Поэтому в программах, как правило, неоднократно используется лишь несколько операторов SQL, независимо от того, какой конкретный программный продукт был выбран для внедрения.

По существу, база данных SQL имеет очень простую логическую структуру. Каждая конкретная инсталляция программного обеспечения SQL обычно может состоять из нескольких баз данных. Например, одна БД может применяться для хранения данных о заказчиках, а другая - содержать данные о товарах. (Возникает определенная сложность, связанная с тем, что сам сервер SQL и коллекции поддерживаемых этим сервером таблиц обычно принято обозначать общим термином база данных.) Каждая база данных содержит несколько таблиц, каждая таблица состоит из тщательно определенных столбцов, а каждая позиция в таблице может рассматриваться как внесенная в таблицу запись, или строка.

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

Важной особенностью указанных четырех операторов SQL является то, что они позволяют манипулировать только значениями, хранящимися в базе данных, но не воздействуют на структуру самой базы данных. Иными словами, команды на основе этих операторов могут использоваться, например, для ввода данных, а не для создания базы данных; с помощью таких команд можно удалить из базы данных любой фрагмент данных, но сама "оболочка" останется нетронутой, поэтому, в частности, нельзя присвоить другой базе данных, работающей под управлением того же сервера, имя существующей базы данных. Для того чтобы добавить или удалить столбцы, уничтожить целую базу данных, не оставив и следа, или создать новую базу данных, необходимо применить другие команды, такие как DROP, ALTER и CREATE.

Все эти операторы мы подробно рассмотрим в следующей статье, посвященной командам MySQL.

От автора: вас обозвали чайником? Ну, это дело поправимое! Каждый самовар когда-то был чайником! Или каждый профессионал был когда-то самоваром? Нет, опять что-то не то! В общем, MySQL для начинающих.

Зачем чайникам MySQL

Если вы всерьез собрались связать свою жизнь с интернетом, то сразу на первых же шагах в «паутине» столкнетесь с этой СУБД. MySQL можно смело назвать «всея интернетной» системой управления базами данных. Без нее не обходится ни один более-менее серьезный ресурса, она присутствует в админке каждого хостинга. И большая часть всех популярных CMS и даже «самопальных» движков построены с ее участием.

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

Но так тяжело MySQL для чайников дается только в том случае, если начать его изучение неправильно. Мы с вами не совершим такой ошибки, и начнем знакомство с данной технологией с самых азов.

Основные понятия

Для начала пройдемся по основным понятиям, которые мы будем упоминать в этой публикации:

База данных (БД) – основная составляющая единица СУБД. БД включает в себя таблицы, которые состоят из столбцов и записей (строк). Образуемые на пересечении ячейки содержат в себе структурированные данные определенного типа.

СУБД (система управления БД) – совокупность всех программных модулей для администрирования баз данных.

SQL – язык структурированных запросов, с помощью которого разработчик «общается» с ядром (сервером) СУБД. Как и любой программный язык, SQL имеет свой синтаксис, набор команд и операторов, поддерживаемые типы данных.

Думаю, для начала теоретических знаний нам достаточно. Недостающие пробелы в теории мы «раскрасим» практикой. Теперь осталось выбрать правильный программный инструмент.

Подбор правильного инструмента

Изрядно «порывшись» во всем ассортименте оболочек MySQL для начинающих, понял, что таких просто не существует. Все программные продукты для администрирования СУБД требуют наличия уже установленного сервера БД. В общем, решил в очередной раз не изобретать «самокат», и остановил свой выбор на отечественном пакете Denwer. Скачать его можно на официальном сайте .

В его состав уже входят все составляющие СУБД, позволяющие новичку сразу после несложной и понятной установки приступить к практическому знакомству с MySQL. Кроме этого Denwer включает в себя еще несколько необходимых для начинающего разработчика инструментов: локальный сервер, PHP.

Первые шаги

Не буду описывать процесс инсталляции «джентльменского» набора, поскольку там все происходит автоматически. После запуска инсталяхи успевай только нужные клавиши жать. Как раз то, что нужно в варианте MySQL для чайников .

Когда закончится процесс установки, запускайте локальный сервер, подождите пару секунд. После этого наберите в адресной строке браузера localhost.

На странице «Ура, заработало!» перейдите по одной из указанных на снимке ссылок. После чего вы попадете в phpMyAdmin – оболочку для администрирования баз данных.

Перейдя по ссылке http://downloads.mysql.com/docs/world.sql.zip, вы скачаете пример тестовой БД с официального сайта MySQL. Опять перейдите в phpMyAdmin, в основном меню сверху зайдите во вкладку «Импорт». В окне «Импорт на текущий» в первом разделе («Импортируемый файл») установите значение «Обзор вашего компьютера».

В окне проводника выберите архив со скачанным примером БД. Внизу основного окна не забудьте нажать «Ок».

Советую пока не изменять указанные значения параметров. Это может привести к некорректному отображению данных импортируемого источника. Если система phpMyAdmin выдала ошибку, что не может распознать алгоритм сжатия БД, тогда разархивируйте ее и повторите весь процесс импорта сначала.

Если все прошло хорошо, то вверху появится сообщение программы, что импорт выполнен успешно, а слева в списке БД — еще одна (word).

Рассмотрим ее структуру изнутри, чтобы вы смогли более наглядно представить, с чем вам придется иметь дело.

Нажмите на название БД MySQL для начинающих. Под ней отобразится список таблиц, из которых она состоит. Кликните по одной из них. Затем перейдите в пункт верхнего меню «Структура». В основной рабочей зоне отобразится структура таблицы: имена всех столбцов, типы данных и все атрибуты.

» Почему используют MySQL?

Навигация по Самоучителю: 1.1 Что такое MySQL? 1.2 Почему используют MySQL? 1.3 Насколько стабилен MySQL? 1.4 Насколько большими могут быть таблицы MySQL? 1.5 MySQL, MySQL AB, MySQL-MAX: что это такое? 1.6 Под какими операционными системами работает MySQL? 1.7 Дистрибутивы MySQL 1.8 Подсказки командной строки MySQL 2.1 Введение в MySQL 2.2 Соединение с сервером MySQL 2.3 Ввод запросов в MySQL 2.4 Создание и использование баз данных 2.5 Создание базы данных MySQL 2.6 Создание таблицы MySQL 2.7 Загрузка данных в таблицу MySQL 2.8 Выбор всех данных из таблицы MySQL 2.9 Выбор конкретных строк из таблицы MySQL 2.10 Выбор произвольных столбцов из таблицы MySQL 2.11 Сортировка строк из таблицы MySQL 2.12 Вычисление дат в таблице MySQL 2.13 Работа со значениями NULL в таблице MySQL 2.14 Сравнение по шаблону. SQL-шаблоны. 2.15 Подсчет строк в SQL-шаблоны. Функция COUNT() 2.16 Использование нескольких таблиц в одном SQL запросе 2.17 Получение информации о базах данных MySQL и таблицах 2.18 Примеры общих запросов в MySQL 2.19 Максимальное значение для столбца MySQL 2.20 В какой строке хранится максимум некоего столбца MySQL 2.21 Максимум столбца в группе MySQL 2.22 В какой строке MySQL находится максимальное значение по группе? 2.23 Применение переменных пользователя в MySQL 2.24 Использование клиента MySQL в пакетном режиме 3.1 Строки в MySQL 3.2 Числа в MySQL. Как писать числа в MySQL? 3.3 Шестнадцатеричные значения в MySQL 3.4 Значения NULL в MySQL 3.5 Имена баз данных, таблиц, индексов, столбцов и псевдонимов в MySQL 3.6 Чувствительность к регистру в именах в MySQL 3.7 Пользовательские переменные в MySQL 3.8 Комментарии в MySQL 3.9 Зарезервированные слова MySQL 4.1 Резервирование баз данных MySQL 4.2 Синтаксис BACKUP TABLE в MySQL 4.3 Синтаксис RESTORE TABLE в MySQL 4.4 Синтаксис CHECK TABLE в MySQL 4.5 Синтаксис REPAIR TABLE в MySQL 4.6 Синтаксис OPTIMIZE TABLE в MySQL 4.7 Синтаксис ANALYZE TABLE в MySQL 4.8 Синтаксис FLUSH в MySQL 4.9 Синтаксис KILL в MySQL 4.10 Синтаксис SHOW в MySQL 4.11 Синтаксис SHOW TABLE STATUS в MySQL 4.12 Синтаксис SHOW STATUS в MySQL 4.13 Синтаксис SHOW VARIABLES в MySQL 4.14 back_log 4.15 character_set, character_sets, concurrent_inserts 4.16 connect_timeout, delay_key_write, delayed_insert_limit 4.17 delayed_insert_timeout, delayed_queue_size, flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_timeout, join_buffer_size, key_buffer_size 4.20 language, log_bin, long_query_time 4.21 lower_case_table_names, max_allowed_packet, max_binlog_cache_size 4.22 max_connections, max_connect_errors, max_delayed_threads 4.23 max_join_size, max_sort_length, max_user_connections 4.24 max_tmp_tables, max_write_lock_count, myisam_sort_buffer_size 4.25 mуisam_max_extra_sоrt_file_size, myisam_max_sort_file_size, net_buffer_length 4.26 net_read_timeout, net_retry_count, net_write_timeout 4.27 open_files_limit, port, record_buffer 4.28 protocol_version, record_rnd_buffer, query_buffer_size 4.29 safe_show_databases, skip_networking, skip_show_databases 4.30 socket, sort_buffer, skip_show_databases 4.31 thread_cache_size, tmp_table_size, wait_timeout 4.32 Синтаксис SHOW PROCESSLIST в MySQL 4.33 Синтаксис SHOW GRANTS в MySQL 4.34 Синтаксис SHOW CREATE TABLE в MySQL 4.35 Файл опций my.cnf в MySQL 5.1 Типы столбцов в MySQL 5.2 Числовые типы в MySQL 5.3 Типы даты и времени в MySQL 5.4 Проблема Y2K (2000 года) и типы Date в MySQL 5.5 Типы DATETIME, DATE и TIMESTAMP в MySQL 5.6 Тип TIME в MySQL 5.7 Тип YEAR в MySQL 5.8 Строковые типы CHAR и VARCHAR в MySQL 5.9 Строковые типы BLOB и TEXT в MySQL 5.10 Строковый тип ENUM в MySQL 5.11 Строковый тип SET в MySQL 5.12 Выбор правильного типа для столбца MySQL 5.13 Использование типов столбцов из других СУБД для MySQL 5.14 Требования столбцов MySQL к памяти 6.1 Функции для использования MySQL в SELECT и WHERE 6.2 Нетипизированный оператор Скобки в MySQL 6.3 Нетипизированный Оператор сравнения в MySQL 6.4 Логические операторы MySQL 6.5 Функции ветвления в MySQL 6.6 Строковые функции в MySQL

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

При постоянной разработке MySQL сегодня предлагает богатый и очень полезный набор функций. Простота, быстродействие и надежность делают MySQL очень подходящим для обращения к базам данных из Internet. Очень важна поддержка поистине огромных объемов данных. Известен случай использования MySQL на 60000 таблиц, суммарно хранящих около 5000000000 строк.

MySQL является системой «клиент-сервер»

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

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

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

MySQL-является полностью многопоточной системой

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

MySQL является пакетом с открытыми исходными текстами

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

MySQL бесплатен в большинстве случаев

MySQL предназначен для некоммерческого использования. Если вы применяете пакет для организации форума, системы гостевых книг или блогов, то вы не должны платить ни за какие лицензии. Достаточно просто скачать пакет с его сайта и поставить на ваш сервер. Но если вам нужна техническая поддержка, то вот за нее-то придется заплатить. Обратите внимание: плата берется именно за техническую поддержку, а не за использование самой программы. Именно это свойство во многом обеспечило этой СУБД столь высокую популярность.

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

Поскольку все данные хранятся в виде таблиц, следует четко определиться с видом таблиц и соответствующей терминологией. Таблица состоит из ячеек , каждая из которых может хранить некоторые данные. Если ячейка никаких данных в настоящий момент не хранит, она называется пустой.

Таблица состоит из вертикальных столбцов и горизонтальных строк, в которые сгруппированы ячейки. Таблица строго прямоугольная , то есть во всех строках одинаковое число ячеек, а во всех столбцах одинаковое количество строк.

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

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

Это очень важно! Большую часть времени вы будете работать со столбцами, поскольку именно они определяют тип данных и структуру таблицы. Строки в таблице не нумеруются, они существуют только для простоты работы с данными. В большинстве случаев количество записей в таблице вас вообще не должно интересовать. Вы работаете с данными, а их структура определена типами и порядком следования столбцов. Количество записей важно только для сервера.

База данных может состоять из нескольких разных таблиц. Их точное количество ограничено, главным образом, памятью компьютера. Сервер может хранить много баз данных. Следует отметить, что вы можете смешивать таблицы из разных баз данных в одном запросе.

Таблица также имеет тип и атрибуты . От этого зависит набор возможностей, доступных при работе с этой таблицей, а также логика ее обработки сервером. Это будет подробно рассмотрено позднее.

Теперь поговорим о данных в полях. Чтобы что-то сделать с какими-то данными, их сначала надо найти. Для этого и используется язык SQL. На нем пишутся запросы, в процессе обработки которых сервер просматривает таблицы базы данных, находит по заданным в запросе критериям требуемые данные и что-то с ними делает (что именно, зависит от запроса).

Те данные, по которым производится поиск записи, называются ключом . Если в записи несколько полей, то найти ее можно по разным ключам, каждый для своего поля. Тот ключ, по которому с наибольшей вероятностью будет производиться поиск записи, называется первичным ключом (PRIMARYKEY). Ключ может относиться не только к одному полю, а сразу к нескольким.

По одному ключу можно найти одну или несколько записей. Если по некоему ключу может быть найдена только одна конкретная запись, такой ключ называют уникальным (UNIQUE). Ключ, подходящий для поиска нескольких различных записей в таблице, называется неуникальным.

Следующим понятием является индекс . Представьте себе, как работает сервер базы данных. Получив запрос, он начинает просматривать таблицы на предмет поиска соответствующих данных. Просмотр выполняется последовательно, строка за строкой. Чтобы удостовериться в том, что собраны все данные, сервер должен просмотреть все строки в таблице (или в таблицах, если поиск идет сразу по нескольким таблицам).

Но легко сказать: просмотреть. А если таблица включает десять тысяч записей? А если миллион? Сервер, конечно, ее просмотрит, но вот сколько времени у него на это уйдет? Немало. А ответ надо получить как можно быстрей.

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

Процесс построения индекса занимает немало времени, но после его создания сервер уже не просматривает всю таблицу в поисках данных: Он ищет данные по индексу, где для каждого встречающегося в таблице значения указано, в каких именно ячейках таблицы можно найти нужные данные. Это существенно ускоряет работу (в десятки раз).

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

Получается, что для каждой таблицы порой следует иметь несколько разных индексов. В MySQL можно иметь до 32 индексов на таблицу. Максимальная индексная длина (то есть длина каждой записи в индексе) составляет до 500 байт. Индекс может включать в себя данные из нескольких столбцов сразу (в текущей реализации MySQL максимальное количество столбцов в каждом индексе составляет 15).

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

Все столбцы имеют значения по умолчанию . Это значит, что если некоему полю явно не задано значение, оно будет установлено автоматически в некоторое значение, принятое по умолчанию, специфичное для каждого типа столбца. Значение по умолчанию можно сменить при создании столбца.

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

Столбцы необязательно создаются вместе с таблицами. Таблицу можно менять по мере надобности, добавляя или удаляя столбцы, меняя их типы. В инструкциях SQL вы можете обращаться к таблицам из различных баз данных с помощью синтаксиса Имя_базы_данных.Имя_таблицы . Это длинное имя позволяет однозначно указать таблицу и называется полным именем таблицы .

Вы также можете обращаться к столбцу в любой таблице указанием синтаксиса Имя_базы_данных.Имя_таблицы.Имя_столбца . Такая конструкция позволяет однозначно опознать столбец и именуется полным именем столбца .

Столбцы помимо имени и типа могут также иметь необязательные атрибуты , которые определяют, как именно сервер обрабатывает тот или иной столбец, меняют логику работы сервера с этим столбцом. Присвоение атрибута столбцу равносильно присвоению этого атрибута соответствующему столбцу полю в каждой записи в таблице. Замечу, что столбцы одного типа, но с разными атрибутами, обрабатываются различными способами.

В ходе работы с СУБД какая-то база данных всегда считается активной или текущей . В ней существует некая активная таблица . Именно с активной таблицей в текущей базе данных будут производиться все действия, если вы явно не укажете иное.

При обращении к столбцу в активной таблице можно вместо его полного имени (с указанием базы данных и таблицы) указывать только имя столбца. Оно автоматически будет дополнено именем активной таблицы текущей базы данных, что существенно ускоряет процесс ввода. Также, если вы обращаетесь к столбцу из другой таблицы в текущей базе данных, то можно указать его имя как Имя_таблицы.Имя_столбца , опустив часть Имя_базы_данных. оно будет приравнено к текущей базе данных.

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

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

Регулярные выражения представляют собой некие последовательности символов, часть или все из которых являются символами подстановки. Например, при работе в Windows вы, скорее всего, сталкивались с обозначениями вида *.doc (соответствует всем файлам с расширением doc в текущем каталоге) или *.* (определяет все файлы в каталоге). Это и есть регулярные выражения, только в Windows их называют иначе. Как видите, ничего сложного в них нет. В MySQL вы не раз встретитесь с такими выражениями (правда, куца более сложными). Именно с их помощью задаются критерии для поиска информации.

Теперь давайте задумаемся о такой сложной проблеме: сервер допускает одновременную работу множества пользователей с одной и той же базой данных (даже с одной и той же таблицей). Но как обеспечить при этом целостность данных? Если один пользователь пишет одни данные, а другой в это же время пытается изменить именно эти данные, они разнесут всю базу данных. Как избежать этого?

Существуют два способа установить разделение, и MySQL применяет оба, правда на разных типах таблиц. Первый это транзакционная модель , второй атомные модификации .

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

Итак, как выглядит работа с транзакцией? Сервер представляет это так: сначала определяется, что именно в таблице будет изменено, затем делается отметка о том, что вот эти ячейки меняются некоторым образом, затем реально вносятся изменения, а потом ставится, отметка, что модификация выполнена. При этом на время внесения изменений таблица либо возвращает старые данные, либо не возвращает вообще ничего, но в любом случае не дает двум пользователям одновременно вносить изменения в одни и те же данные. Сначала первый заканчивает модификацию, потом за дело берется следующий.

Разница между транзакцией и атомной модификацией, если отбросить всю научную теорию, для конечного пользователя заключается в том, что в случае транзакционной модели пользователь может после выполнения запроса, который изменяет какие-то данные в таблице, решить, как именно он хочет завершить транзакцию: следует ли сохранить изменения (commit) или Отказаться от них (вызвать обратную перемотку, rollback ), вернув тем самым таблицу к тому состоянию, которое она имела до вызова запроса. Следует отметить, что существует режим автоматического сохранения всех изменений (AUTO_COMMIT). В атомной модели изменения отменены быть не могут: они вносятся в таблицу немедленно. Выполняемая в настоящий момент транзакция именуется активной.

MySQL по умолчанию использует свой формат таблиц: MyISAM. Раньше применялся тоже собственный формат ISAM, но теперь он объявлен устаревшим и поддерживается исключительно для совместимости со старыми пользователями. Если у вас есть таблицы в этом формате, мы очень рекомендуем конвертировать их в новый формат MyISAM. Он работает надежнее и быстрее.

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

Таблица 1.1. Краткие описания поддерживаемых MySQL типов таблиц.

Обратите внимание, что не все версии сервера поддерживают все перечисленные таблицы! Типы ISAM и MyISAM поддерживаются всегда, а вот насчет остальных возможны варианты. Так что посмотрите на сайте http://www.mysql.com , что именно вам нужно.

Дампом называется некое промежуточное представление базы данных. Причем, обычно оговаривается то, какое именно представление данных имеется в виду. Например, дамп в текстовый файл означает, что вся база данных конвертируется и сохраняется в виде текстового файла.

Зачем это нужно? Дампы очень удобны для резервного копирования, а также для переноса данных между разными серверами. Может возникнуть необходимость применения дампа и в рамках одного сервера.

В таблице 1.1 показаны разные типы таблиц. Каждый из них имеет свой внутренний формат хранения данных. Самый простой способ конвертации одного в другой сводится к дампам.

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

1. Оптимизируйте ваши запросы для кэша запросов.

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

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

// Кэш запроса НЕ РАБОТАЕТ $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // Кэш запроса РАБОТАЕТ! $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= "$today"");

Причина того, что кэш запросов не работает в первом случае, заключается в использовании функции CURDATE() . Такой подход используется для всех недетерминированных функций, например, NOW(), RAND() и т.д. Так как возвращаемый результат функции может измениться, то MySQL решает не размещать данный запрос в кэше. Все что, нужно, чтобы исправить ситуацию - это добавить дополнительную строчку кода PHP перед запросом.

2. Используйте EXPLAIN для ваших запросов SELECT

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

Результат запроса EXPLAIN показывает, какие индексы используются, как таблица сканируется и сортируется, и так далее.

Возьмем запрос SELECT (предпочтительно, чтобы он был сложным, с JOIN), добавим перед ним ключевое слово EXPLAIN. Вы можете использовать PhpMyAdmin для этого. Такой запрос выведет результат в прекрасную таблицу. Допустим, мы забыли добавить индекс для столбца, который используется для JOIN:

После добавления индекса для поля group_id:

Теперь вместо сканирования 7883 строк, будут сканироваться только 9 и 16 строк из двух таблиц. Хорошим методом оценки производительности является умножение всех чисел в столбце “rows”. Результат примерно пропорционален прорабатываемому объему данных.

3. Используйте LIMIT 1, если нужно получить уникальную строку

Иногда, во время использования запроса, вы уже знаете, что ищете только одну строку. Вы можете получить уникальную запись или просто проверить существование любого количества записей, которые удовлетворяют предложению WHERE.

В таком случае добавление LIMIT 1 к вашему запросу может улучшить производительность. При таком условии механизм базы данных останавливает сканирование записей как только найдет одну и не будет проходит по всей таблице или индексу.

// Есть ли какой нибудь пользователь из Алабамы? // Так не нужно делать: $r = mysql_query("SELECT * FROM user WHERE state = "Alabama""); if (mysql_num_rows($r) > 0) { // ... } // Вот так будет значительно лучше: $r = mysql_query("SELECT 1 FROM user WHERE state = "Alabama" LIMIT 1"); if (mysql_num_rows($r) > 0) { // ... }

4. Индексируйте поля поиска

Индексируйте не только основные и уникальные ключи. Если какие-нибудь столбцы в вашей таблице используются для поисковых запросов, то их нужно индексировать.

Как вы можете видеть, данное правило применимо и к поиску по части строки, например, “last_name LIKE ‘a%’”. Когда для поиска используется начало строки, MySQL может использовать индекс столбца, по которому проводится поиск.

Вам также следует разобраться, для каких видов поиска нельзя использовать обычное индексирование. Например, при поиске слова (“WHERE post_content LIKE ‘%apple%’”) преимущества индексирования будут не доступны. В таких случая лучше использовать полнотекстовый поиск mysql или построение собственных решений на основе индексирования.

5. Индексирование и использование одинаковых типов для связываемых столбцов

Если ваше приложение содержит много запросов с директивой JOIN, вам нужно индексировать столбцы, которые связываются в обеих таблицах. Это оказывает эффект на внутреннюю оптимизацию операций связывания в MySQL.

Также связываемые столбцы должны иметь одинаковый тип. Например, если вы связываете столбец DECIMAL со столбцом INT из другой таблицы, MySQL не сможет использовать индекс по крайней мере для одной из двух таблиц. Даже кодировка символов должна быть одинаковой для одинаковых столбцов строчного типа.

// Поиск компании из определенного штата $r = mysql_query("SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id"); // оба столбца для названия штата должны быть индексированы // и оба должны иметь одинаковый тип и кодировку символов // или MySQL проведет полное сканирование таблицы

6. Не используйте ORDER BY RAND()

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

Если вам действительно нужно случайным образом располагать строки в результате вашего запроса, то существует множество лучших способов решить такую задачу. Конечно, это будет реализовано дополнительным кодом, но вы будете спасены от проблемы, которая растет по экспоненциальному закону вместе с ростом объема данных. Дело в том, что MySQL выполняет операцию RAND() (которая занимает время процессора) для каждой отдельной строки в таблице перед тем, как отсортировать ее и выдать вам только одну строку.

// Так делать НЕ НУЖНО: $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1"); // Вот так будет лучше работать: $r = mysql_query("SELECT count(*) FROM user"); $d = mysql_fetch_row($r); $rand = mt_rand(0,$d - 1); $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");

Так вы получаете случайное число, которое меньше, чем количество строк в результате запроса, и используете его как смещение в предложении LIMIT.

7. Старайтесь не использовать SELECT *

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

Хорошей привычкой является указание столбца при выполнении SELECT.

// Плохо: $r = mysql_query("SELECT * FROM user WHERE user_id = 1"); $d = mysql_fetch_assoc($r); echo "Welcome {$d["username"]}"; // Так лучше: $r = mysql_query("SELECT username FROM user WHERE user_id = 1"); $d = mysql_fetch_assoc($r); echo "Welcome {$d["username"]}"; // Разница становится существенной на больших объемах данных

8. Старайтесь использовать поле id везде

Хорошей практикой является использование в каждой таблице поля id, для которого установлены свойства PRIMARY KEY, AUTO_INCREMENT, и оно имеет тип из семейства INT. Предпочтительно - UNSIGNED, так как в этом случае значение не может быть отрицательным.

Даже если в вашей таблице есть поле с уникальным именем пользователя, не делайте его основным ключом. Поля с типом VARCHAR медленно работают в качестве основных ключей. Также структура вашей базы данных будет лучше, если в ней внутри использовать ссылки на записи на основании id.

Кроме того механизм MySQL использует основные ключи для своих внутренних задач, и использование поля id создает оптимальные условия для их решения.

Одним возможным исключением из данного правила являются “ассоциативные таблицы”, которые используются для отношений многие-ко-многим между двумя другими таблицами. Например, таблица “posts_tags” содержит 2 столбца: post_id, tag_id. Они используются для описания отношений между двумя таблицами “post” и “tags”. Описанная таблица может иметь основной ключ, который содержит оба поля id.

9. Используйте ENUM вместо VARCHAR

// Создаем подготовленное выражение if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) { // Привязываем параметры $stmt->bind_param("s", $state); // Выполняем $stmt->execute(); // Привязываем переменные результата $stmt->bind_result($username); // Получаем значения $stmt->fetch(); printf("%s is from %s\n", $username, $state); $stmt->close(); }

13. Небуферированные запросы

Обычно, когда вы выполняете запрос из скрипта, то работа скрипта прерывается до тех пор, пока запрос не будет выполнен. Такой порядок действий можно изменить с помощью небуферированных запросов.

Отличное объяснение функции mysql_unbuffered_query() из документации PHP:

“mysql_unbuffered_query() отправляет SQL запрос на сервер MySQL без автоматического получения и буферирования строк результата, как это делает функция mysql_query(). Таким образом, сохраняется определенный объем памяти запросами SQL, которые выдают большой набор результата, и можно начинать работать с набором результата сразу же после получения первой строки, не дожидаясь пока запрос SQL будет полностью выполнен.”

Однако существует несколько ограничений. Вы должны либо прочитать все строки либо вызвать mysql_free_result() перед тем, как выполнить следующий запрос. Также нельзя использовать mysql_num_rows() или mysql_data_seek() для набора результата.

14. Храните IP адрес как UNSIGNED INT

Многие программисты создают поле VARCHAR(15) для хранения IP адреса, даже не задумываясь о том, что будут хранить в этом поле целочисленное значение. Если использовать INT, то размер поля сократится до 4 байт, и оно будет иметь фиксированную длину.

Нужно использовать тип UNSIGNED INT, так как IP адрес задействует все 32 бита беззнакового целого.

$r = "UPDATE users SET ip = INET_ATON("{$_SERVER["REMOTE_ADDR"]}") WHERE user_id = $user_id";

15. Таблицы с фиксированной длиной записи (Static) работают быстрее

Когда каждый отдельный столбец в таблице имеет фиксированную длину, то вся таблица в целом рассматривается как “static” или “с фиксированной длиной записи” . Примеры типов столбцов, которые не имеют фиксированной длины: VARCHAR, TEXT, BLOB. Если вы включите хотя бы один столбец с таким типом, то таблица перестает рассматриваться как "static" и будет по-другому обрабатываться механизмом MySQL.

Таблицы "static" быстрее обрабатываются механизмом MySQL при поиске записей. Когда нужно прочитать определенную запись в таблице, то ее положение быстро вычисляется. Если размер строки не фиксирован, то для определения положения записи нужно время на поиск и сопоставление с индексом основного ключа.

Такие таблицы также проще кэшировать и проще восстанавливать при сбоях. Но они могут занимать больше места. Например, если конвертировать поле VARCHAR(20) в поле CHAR(20), то всегда будут заняты 20 байт вне зависимости от того, используются они или нет.

Использование техники "Вертикальное разделение" дает возможность отделить столбцы с переменной длиной в отдельную таблицу.

16. Вертикальное разделение

Вертикальное разделение - это действие по разделению структуры таблицы по вертикали с целью оптимизации.

Пример 1 : У вас есть таблица, которая содержит домашние адреса, редко используемые в приложении. Вы можете разделить вашу таблицу и хранить адреса в отдельной таблице. Таким образом основная таблица пользователей сократится в размере. А как известно, меньшая таблица обрабатывается быстрее.

Пример 2 : У вас в таблице есть поле “last_login”. Оно обновляется каждый раз, когда пользователь регистрируется на сайте. Но каждое обновление таблицы вызывает кэширование запроса, что может создать перегрузку системы. Вы можете выделить данное поле в другую таблицу, чтобы сделать обновления таблицы пользователей не такими частыми.

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

17. Разделяйте большие запросы DELETE или INSERT

Если вам нужно выполнить большой запрос DELETE или INSERT на работающем сайте, то нужно быть осторожным, чтобы не нарушить трафик. Когда выполняется большой запрос, то он может заблокировать ваши таблицы и привести к остановке приложения.

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

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

Если у вас есть скрипт, который удаляет большое количество записей, просто используйте предложение LIMIT для разбиения его на маленькие партии, чтобы избежать описанной ситуации.

While (1) { mysql_query("DELETE FROM logs WHERE log_date <= "2009-10-01" LIMIT 10000"); if (mysql_affected_rows() == 0) { // выполняем удаление break; } // вы можете сделать небольшую паузу usleep(50000); }

18. Маленькие столбцы обрабатываются быстрее

Для механизма базы данных диск является наиболее важным узким местом. Стремление сделать все более компактным и маленьким обычно хорошо сказывается в сфере производительности за счет сокращения объема перемещаемых данных.

Документация MySQL содержит список норм хранения данных для всех типов.

Если таблица будет содержать всего несколько строк, то нет причин делать основной ключ типа INT, а не MEDIUMINT, SMALLINT или даже TINYINT. если вам нужна только дата, используйте DATE вместо DATETIME.

Нужно только помнить о возможностях роста.

19. Выбирайте правильный механизм хранения данных

Есть два основных механизма хранения данных для MySQL: MyISAM и InnoDB. Каждый имеет свои достоинства и недостатки.

MyISAM отлично подходит для приложений с большой нагрузкой по чтению, но он не очень хорошо масштабируется при наличии большого количества записей. Даже если вы обновляете одно поле в одной строке, вся таблица будет заблокирована и ни один процесс не сможет ничего прочитать пока запрос не завершится. MyISAM быстро выполняет вычисления для запросов типа SELECT COUNT(*).

InnoDB является более сложным механизмом хранения данных, и он может быть более медленным, чем MyISAM для большинства маленьких приложений. Но он поддерживает блокирование строк, что лучше для масштабирования таблиц. Также он поддерживает некоторые дополнительные особенности, такие как транзакции.

20. Используйте объектно-реляционное отображение

Использование объектно-реляционного отображения (ORM - Object Relational Mapper) дает ряд преимуществ. Все, что можно сделать в ORM , можно сделать вручную, но с большими усилиями и более высокими требованиями к уровню разработчика.

ORM отлично подходит для "ленивой загрузки". Это означает, что получение значений возможно тогда, когда они нужны. Но нужно быть аккуратным, потому что можно создать много маленьких запросов, которые понизят производительность.

ORM может также объединять ваши запросы в транзакции, которые выполняются существенно быстрее, чем индивидуальные запросы к базе данных.

Для PHP можно использовать ORM Doctrine .

21. Будьте осторожны с постоянными соединениями

Постоянные соединения предназначены для сокращения потерь на восстановление соединений к MySQL. Когда создается постоянное соединение, то оно остается открытым даже после завершения скрипта. Так как Apache повторно использует дочерние процессы, то процесс выполняется для нового скрипта, и он использует тоже соединение с MySQL.

Это звучит здорово в теории. Но в действительности это функция не стоит медного гроша из-за проблем. Она может вызывать серьезные неприятности с ограничениями количества соединений, переполнение памяти и так далее.

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







2024 © gtavrl.ru.