Задача: Рекурсивно поднимаем статистику по количеству аккаунтов на указанную дату.
При этом у аккаунта есть только период с-по.
Основная задача – сгенерировать даты.
Continue reading »
Как отдебажить SQL-запрос, сотворённый через PDO – нашёл скриптик, который представляет собой обёртку над PDO – PDOTester.
Continue reading »
Установка MySQL:
Continue reading »
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html
Не знал про COALESCE – функцию, которая возвращает первое ненулевое значение из переданных параметров.
Перечислю основное.
Версия 5.0 (http://dev.mysql.com/doc/refman/5.0/en/mysql-nutshell.html):
- Курсоры
- Хранимые функции
- Триггеры
- VIEW
- INFORMATION_SCHEMA (база о базах данных сервера)
- Тип данных VARCHAR
Версия 5.1 (http://dev.mysql.com/doc/refman/5.1/en/mysql-nutshell.html):
- Оптимизация оптимизатора (особенно GROUP BY)
- InnoDB plugin
- Partitioning
- Row based replication
Версия 5.4 (http://dev.mysql.com/doc/refman/5.4/en/mysql-nutshell.html):
- Улучшена масштабируемость
- Изменение подсистемы ввода-вывода InnoDB
Top 1000 SQL Performance Tips
Continue reading »
По этому адресу – список полезных инструментов для тюнинга mySQL:
http://dev.mysql.com/doc/refman/5.1/en/mysql-nutshell.html
Ссылка на статью.
Для чего они нужны:
- чтобы проверить и предотвратить вставку некорректных данных
- чтобы изменить или отменить процедуры INSERT, UPDATE, DELETE
- чтобы отслеживать изменения данных внутри сесии.
Триггер – это фактически хранимая процедура, выполняющаяся при определённом событии, относящемся к определённым данным (хотя и с некоторыми нюансами).
Синтаксис:
CREATE TRIGGER <trigger name>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <table name>
FOR EACH ROW
<triggered SQL statement>
При этом доступны специфичные пространства имён OLD и NEW в зависимости от контекста (INSERT, UPDATE, DELETE)
CREATE TRIGGER t21_au BEFORE UPDATE ON t22 FOR EACH ROW BEGIN SET @old = OLD . s1; SET @new = NEW.s1; END;//
Пример использования для предотвращения вставки некорректных данных
CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1)) ENGINE=INNODB// CREATE TRIGGER t25_bi BEFORE INSERT ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;// CREATE TRIGGER t25_bu BEFORE UPDATE ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;// INSERT INTO t25 VALUES (0,'a') /* priming the pump */ // INSERT INTO t25 VALUES (5,'b') /* gets error '23000' */ //
Для тех, кто не знает, что это такое – ссылка
Вкратце: созздаёт, фактически, «временную таблицу» (более правильно сказать – виртуальную таблицу или результат выборки в виде таблицы), в которой могут храниться данные из других таблиц и результаты применения аггрегирующих функций к ним. При этом если хранятся только данные, то эта таблица обновляется при обновлении входящих в её состав таблиц.
Но оказывается, что, как и многие нововведения (хранимые процедуры должны перекомпилироваться заново при начале сессии, если использовать подзапросы – очень много запросов получается), это тоже имеет очень большие проблемы с производительностью (ссылка).
Вкратце:
неудобно искать проблемы в запросах (вроде как обращаешься к одной таблице, а на деле – нет), создаётся временная таблица без индексов. Также есть проблемы у mySQL при оптимизации запросов при обращении к VIEW.