powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
4 сообщений из 4, страница 1 из 1
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
    #38668885
BugaLol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем. Пишу партнерскую программу, нужно учитывать хосты/хиты по сабидам (SubID - это, упрощенно, просто текстовая строка, параметр, передаваемый юзером).
Так вот. Юзер заходит на сайт, нужно наименьшим количеством запросов добавить инфу о нем в БД. Сейчас я имею такую структуру, что при каждом заходе осуществляется всего 2 запроса. Первый на проверку существования нужной кампании, второй, собственно, на добавление инфы о визите.
Но добавляется не количество хостов/хитов, а просто инфа о том, уникальный этот посетитель или нет и его сабид.
Да, добавление инфы происходит быстро, но просмотр статистики затруднен. Ибо каждому партнеру надо пробегать по всей огромной таблице визитов и очень сложным запросом с подзапросами считатать хосты/хиты по сабидам. Типа нужно найти все уникальные сабиды (для этого партнера и для определенной кампании) и посчитать сколько хостов/хитов по ним, тупо считая каждый визит.
В итоге уже на таблице в 10к записей этот запрос осуществляется 13 секунд, что совершенно неприемлимо. Тем более что просмотр статы по сабидам - самая нужная и популярная операция в партнерке.

И вот, я решил не хранить вообще инфу о каждом определенном визите, а только о хостах/хитах.
Хотел добавлять инфу таким запросом:
Код: sql
1.
2.
REPLACE `subids` SET `visits` = `visits` + 1, `uniques` = uniques + 1
WHERE `timestamp` = ? AND `id_campaign` = ? AND `subid` = ?



Но проблема в том, что REPLACE (или INSERT ON DUPLICATE KEY) поддерживает в условии WHERE только поиск по UNIQUE индексу.
И ведь комбинация всегда уникальна. У некоторой кампании не может быть повторяющихся сабидов. То есть сама комбинация (ид кампании + строка сабида) всегда уникальна, но не каждый столбец по отдельности.
Можно выделить их в отдельную таблицу, и вставлять UNIQUE ид комбинации из этой таблицы, но тогда количество запросов на посетителя возрастет в 2 раза, что очень плохо, ведь в день могут быть десятки тысяч визитов. И на каждый по 5-7 запросов - это ужасно.

Вообщем, как заставить REPLACE (или INSERT ON DUPLICATE KEY) работать с любым условием WHERE? Под заданное условие всегда будет подходить только одна запись, но MySQL мне как бы не верит, хех, и заставляет юзать только UNIQUE индекс.
...
Рейтинг: 0 / 0
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
    #38669049
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select fk_iduser , sum(size + add_bytes) as 'tatal'
from files 
group by fk_iduser



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

54к записей время 0,686сек
юзеров 7 штук.(разрабатываеться дело...:) )



Код: sql
1.
2.
3.
select fk_idfolder,count(*) from folders
where fk_idfolder between 1111000 and 1111111
group by fk_idfolder


в базе дерево папок храниться.
14 000 000+ записей, отрабатывает за 0,794сек
(правда этот сервер побыстрее, не тестовый)

insert on duplicate key.

... структуру таблиц покажи
...
Рейтинг: 0 / 0
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
    #38669068
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BugaLol,

ответ в лоб
1)влюбом случае храни все визиты...зачем же сгоряча рубить
2)на вставку визита отдельного, делаешь тригер, который добавит в агрегирующую таблицу

3)
твоя делема.
уникальным у меня щитаеться набор полей f1 f2 f3 - так и построй уникальный ключ по трём полям!!!
Insert on update
если для даной комбинации ещо небыло визита, будет вставка - дальше будет обновление :)
при любом нарушении уникальности - будь то ключ по полю или по 50 полям.

4)ещо задумайся вот над чем.
самая популярная операция статистики...смотреть за весь период? нет. более того, обновляться статистика будет только за текущие сутки.

поэтому у тебя две таблицы - одна статистика, другая статистика сегодняшнего дня - тип таблицы мемори :)
если у тебя запись одна пускай на 200 байт, плюс на индекс 100 байт, 300 байт на строку, 10000 записей, 3000 000 байт, я к тому что по памяти не сильно застратно будет.

останеться задачка, как в конце суток переключатель сделать.
...
Рейтинг: 0 / 0
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
    #38669162
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
повесь уникальный индекс на два поля
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]