MySQL: Как беречь собственные нервы и базу данных

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

Единичные операции с таблицами заменяем одной операцией

DELETE FROM table WHERE id=1;
DELETE FROM table WHERE id=2;
DELETE FROM table WHERE id=3;
DELETE FROM table WHERE id IN (1,2,3);

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

INSERT INTO table VALUES (1,2);
INSERT INTO table VALUES (1,2);
INSERT INTO table VALUES (1,2);
INSERT INTO table VALUES (1,2), (1,2), (1,2);

Обновление чуть покруче выглядит (автомагия по ключевому полю), но работает зато быстро быстро

UPDATE table SET val=1 WHERE id=1;
UPDATE table SET val=2 WHERE id=2;
UPDATE table SET val=3 WHERE id=3;
INSERT INTO table (val, id) VALUES (1, 1), (2,2), (3,3)
  ON DUPLICATE KEY UPDATE table.val = VALUES(val);

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

DELETE FROM table WHERE something
RENAME TABLE table TO table_old;
CREATE TABLE table FROM table_old;
INSERT INTO table 
   SELECT * FROM table_old WHERE NOT something;

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

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">