====== MySQL шпаргалки ====== Полезные советы и шпаргалки при работе с MySQL ===== Общие факты ===== * Полезно под каждую базу на сервере создавать своего пользователя * Кодировка базы может быть любой, если она UTF-8 * В большинстве случаев лучше использовать движок **InnoDB** * В php лучше забыть про сильно устаревшее расширение **mysql** и по-возможности использовать **pdo** или **mysqli** * Новую копию **MySQL** всегда можно настроить и оптимизировать * Без особой нужды не стоит открывать **MySQL** наружу. Вместо этого можно сделать проброс портов |ssh -fNL LOCAL_PORT:localhost:3306 REMOTE_USER@REMOTE_HOST | ===== Работа с данными ===== ==== Числа ==== * На 32-битных системах практически нет смысла ставить для типа ''INTEGER'' свойство ''UNSIGNED'', так как такие большие числа в php не поддерживаются. На 64-битных системах, php поддерживает большие числа, вплоть до ''MySQL BIGINT'' со знаком. * Связанные таблицы (**«Foreign keys»**) должны иметь полное сходство по структуре ключей. Т.е. если у нас на одной таблице для поля указано **«INTEGER UNSIGNED DEFAULT 0 NOT NULL»** то и на другой должно быть указано аналогично * Для хранения булевых значений, нужно использовать ''TINYINT(1)'' * А деньги лучше хранить в ''DECIMAL(10, 2)'', где первое число обозначает количество всех знаков, включая запятую, а второе — количество знаков после запятой. Итого, у нас получится что ''DECIMAL(10,2)'' может сохранить 9999999,99 ==== Строки ==== * В старых версиях (до 5.0.3) ''VARCHAR'' была ограничена 255 символами, но сейчас можно указывать до 65535 символов * Помним, что тип ''TEXT'' ограничен только 64 килобитами, поэтому что бы сохранять «Войну и Мир» пользуйтесь **«LONGTEXT»** * Самая правильная кодировка для нашей БД UTF-8 ==== Даты ==== Не забываем, что: * ''DATE'', ''TIME'', ''DATETIME'' — выводятся в виде строк, поэтому поиск и сравнение дат происходит через преобразование * ''TIMESTAMP'' — хранится в виде ''UNIX_TIMESTAMP'', и можно указать автоматически обновлять колонку * Сравнивая типы данных ''DATETIME'' и ''TIMESTAMP'', не забываем делать преобразование типов, например: |SELECT * FROM table WHERE `datetime` = DATE(`timestamp`) | ==== Перечисления ==== * Для перечислений правильно использовать тип ENUM * Можно ставить значение по-умолчанию, как и для любой строки * В базе поле с перечислением хранится как число, поэтому скорость работы — потрясающе высокая * Количество перечислений ~ 65 тысяч ===== Отладка ===== * Если запросы тормозят, то можно включить лог для медленных запросов в ''/etc/mysql/my.cnf'' * А потом оптимизировать запросы через ''EXPLAIN'' * И наблюдать за запросами удобно через программу **mytop** ===== Работа с backup`ами ===== === Создаем backup === |mysqldump -u USER -pPASSWORD DATABASE > /path/to/code/dump.sql | === Создаём структуру базы без данных === |mysqldump --no-data - u USER -pPASSWORD DATABASE > /path/to/code/schema.sql | Если нужно сделать дамп только одной или нескольких таблиц |mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/code/dump_table.sql | === Создаём бекап и сразу его архивируем === |mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz | === Создание бекапа с указанием его даты === |mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz` | === Заливаем бекап в базу данных === |mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql | === Заливаем архив бекапа в базу === |gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE | или так |zcat /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE | === Создаём новую базу данных === |mysqladmin -u USER -pPASSWORD create NEWDATABASE | Удобно использовать бекап с дополнительными опциями ''-Q'' ''-c'' ''-e'', т.е. |mysqldump -Q -c -e -u USER -pPASSWORD DATABASE > /path/to/code/dump.sql | ''-Q'' оборачивает имена обратными кавычками ''-c'' делает полную вставку, включая имена колонок ''-e'' делает расширенную вставку. Итоговый файл получается меньше и делается он чуть быстрее Для просмотра списка баз данных можно использовать команду: |mysqlshow -u USER -pPASSWORD | А так же можно посмотреть список таблиц базы: |mysqlshow -u USER -pPASSWORD DATABASE | Для таблиц **InnoDB** надо добавлять ''--single-transaction'', это гарантирует целостность данных бекапа. \\ Для таблиц **MyISAN** это не актуально, ибо они не поддерживают транзакционность.