MySQL, удаление дубликатов
Существует множество универсальных решений данной задачи, но в MySQL всё решается ещё проще:
ALTER IGNORE TABLE my_table ADD UNIQUE INDEX(a, b);
Существует множество универсальных решений данной задачи, но в MySQL всё решается ещё проще:
ALTER IGNORE TABLE my_table ADD UNIQUE INDEX(a, b);
Спустя три года и один день, обновилась, пожалуй, самая быстрая утилита-PHP-скрипт для резервного копирования и восстановления баз данных MySQL.
Вкусности новой версии:
- Работает в 7-8 раз быстрее старой версии (а она работала очень даже шустро).
- «Умный» лёгкий дамп.
- Разные стратегии восстановления.
- Ещё более приятный интерфейс.
- Корректное автоматическое продолжение работы при завершении по таймауту.
- Сервисные функции MySQL в интерфейсе.
- Можно сохранять задачи для быстрого запуска вручную или по крону.
- Возможность автоматического удаления старых дампов.
- Можно завершить, поставить на паузу.
- Отзывчивый прогресс-бар.
- API для прикручивания сторонней авторизации.
Пробуем
Иногда, чтобы что-нибудь поотлаживать, требуется быстро получить структуру и 100—200 записей в каждой таблице из очень большой базы.
Для MySQL это делается так:
mysqldump mydatabase --where="true limit 100" | gzip > mydatabase.sql.gz
Чётко и понятно о плюсах и минусах MyISAM и InnoDB.
Peter из компании Percona в переводе Владимира.
Читаем
Сразу предупреждаю, что эффективней использовать несколько «классических» запросов и, по возможности, транзакции (которые MyISAM не поддерживает). Так что… для общего развития:
UPDATE tbl_country SET price = CASE
WHEN code = 1 THEN 123;
WHEN code = 2 THEN 456;
…
END
WHERE code IN (1,2,…)
INSERT INTO tbl_country
(code, price)
VALUES
(1, 123),
(2, 456),
…
ON DUPLICATE KEY UPDATE tbl_country.price = VALUES(price);
Какую таблицу из двух выбрать для своей базы данных в случае использования UTF?
utf8_general_ci
Убирает все акценты и приводит к верхнему регистру: ÀÁÅåāă = A, ü = U.
Не очень точно отрабатывает при сортировках. Иногда полезно при поиске. Быстрее utf8_unicode_ci.
Подходит для Русского. При использовании Белорусского и Украинского сортировка будет не верной.
utf8_unicode_ci
Довольно точно при сортировке и поиске. Например, ß (немецкий эсцет) будет при сортировке располагаться рядом с ss, как ему и положено. Медленнее utf8_general_ci.
Замечательно подходит для Русского, Белорусского и Украинского.
Итог
Если проект исключительно русскоязычный и скорость поиска и сравнения критична — можно остановится на utf8_general_ci. Если же есть планы по поддержке большего количества языков — лучше использовать utf8_unicode_ci.
Полные таблички utf8_unicode_ci и utf8_general_ci (там, кстати, и все остальные есть).
Задача: выбрать новости с id = [2, 10, 3, 88, 23] соблюдая порядок.
SELECT *
FROM news
WHERE id IN (2, 10, 3, 88, 23)
ORDER BY FIELD (id, 2, 10, 3, 88, 23)
Что только не придумают иногда программисты… Задача — изменить значение cron в таблице ml на противоположное. Код немного не SQL т.к., скорее всего, писался под Drupal:
UPDATE {ml} SET cron = (SELECT if(cron = 0,"1","0")) WHERE yid = %d
Хотя на самом деле можно проще, быстрее и понятней:
UPDATE {ml} SET cron = !cron WHERE yid = %d
Вчера столкнулся с интересной штукой при работе с MySQL:
SELECT NULL + 13
даст нам NULL.
Чтобы получилось ожидаемое (по крайней мере я почему-то ожидал) 13:
SELECT IFNULL(NULL, 0) + 13
IFNULL возвращает то, что передано вторым параметром, если первый равен NULL.
Вместо NULL, как вы наверное догадались, было поле типа INT.
Иногда требуется вставить запись в таблицу, если её там до сих пор нет. Можно сделать пару запросов: одним —проверить, другим — вставить, а можно и одним:
INSERT IGNORE INTO `users`
SET `login` = 'samdark', `password` = 'mypassword';
Поле `login` должно быть уникальным.