April 23rd, 2009

A-A-A

Нет, всё же я понимаю…

…почему MySQL — популярен, а PostgreSQL — нет. Потому что MySQL понимает что ты от него хочешь по довольно корявым запросам. Хотя и однозначным. А PostgreSQL требует строгости. Ну вот пример. Есть две таблички — requests и request_uris. Вторая по сути — справочник, что бы не хранить десяттыщраз (а на деле — миллионы раз) одни и те же строчки (URI) от HTTP-запросов (это до предела нормализованный лог веб-сервера). Ну вот так оно примерно (синтаксис PostgreSQL):

CREATE TABLE request_uris (
 id SERIAL PRIMARY KEY,
 uri VARCHAR(255) NOT NULL DEFAULT ”,
 UNIQUE(uri)
);

CREATE TABLE requests (
 id SERIAL PRIMARY KEY,
 …
 uri INT NOT NULL REFERENCES request_uris ON DELETE RESTRICT,
 status INT NOT NULL DEFAULT 404,
 …
);

Очевидная задача — посчитать сколько раз к какому URI обращались. На MySQL у меня это было записано вот так:

SELECT COUNT(requests.uri) AS cnt, request_uris.uri FROM requests JOIN request_uris ON requests.uri = request_uris.id WHERE requests.status > 199 AND requests.status < 400 GROUP BY requests.uri ORDER BY cnt DESC;

Заметьте: я группирую по requests.uri, а request_uris.uri не группируется и не аггрегируется. Это, естественно, работает так как requests.uri (по которому идёт группировка) однозначно соответствует request_uris.uri. Очевидно же что группировка по int эффективней группировки по строке!

MySQL это отлично съедает и выдаёт правильный результат. PostgreSQL требует что бы request_uris.uri был или под аггрегацией или в GROUP BY! Нет, группировка по request_uris.id его тоже не устраивает.

И как в такой ситуации ожидать эффективности?

A-A-A

Сервер автра поедет в Инфобокс.

Потому что на новой площадке W+ оно не заводится по каким-то W+'овским причинам.
Всё.
Будет смена IP-адреса, адрес буду знать завтра, завтра переделегирую все свои домены, к субботе должно заработать.