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 это не актуально, ибо они не поддерживают транзакционность.