|
|
|
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
|
|||
|---|---|---|---|
|
#18+
Привет всем. Пишу партнерскую программу, нужно учитывать хосты/хиты по сабидам (SubID - это, упрощенно, просто текстовая строка, параметр, передаваемый юзером). Так вот. Юзер заходит на сайт, нужно наименьшим количеством запросов добавить инфу о нем в БД. Сейчас я имею такую структуру, что при каждом заходе осуществляется всего 2 запроса. Первый на проверку существования нужной кампании, второй, собственно, на добавление инфы о визите. Но добавляется не количество хостов/хитов, а просто инфа о том, уникальный этот посетитель или нет и его сабид. Да, добавление инфы происходит быстро, но просмотр статистики затруднен. Ибо каждому партнеру надо пробегать по всей огромной таблице визитов и очень сложным запросом с подзапросами считатать хосты/хиты по сабидам. Типа нужно найти все уникальные сабиды (для этого партнера и для определенной кампании) и посчитать сколько хостов/хитов по ним, тупо считая каждый визит. В итоге уже на таблице в 10к записей этот запрос осуществляется 13 секунд, что совершенно неприемлимо. Тем более что просмотр статы по сабидам - самая нужная и популярная операция в партнерке. И вот, я решил не хранить вообще инфу о каждом определенном визите, а только о хостах/хитах. Хотел добавлять инфу таким запросом: Код: sql 1. 2. Но проблема в том, что REPLACE (или INSERT ON DUPLICATE KEY) поддерживает в условии WHERE только поиск по UNIQUE индексу. И ведь комбинация всегда уникальна. У некоторой кампании не может быть повторяющихся сабидов. То есть сама комбинация (ид кампании + строка сабида) всегда уникальна, но не каждый столбец по отдельности. Можно выделить их в отдельную таблицу, и вставлять UNIQUE ид комбинации из этой таблицы, но тогда количество запросов на посетителя возрастет в 2 раза, что очень плохо, ведь в день могут быть десятки тысяч визитов. И на каждый по 5-7 запросов - это ужасно. Вообщем, как заставить REPLACE (или INSERT ON DUPLICATE KEY) работать с любым условием WHERE? Под заданное условие всегда будет подходить только одна запись, но MySQL мне как бы не верит, хех, и заставляет юзать только UNIQUE индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2014, 13:22:59 |
|
||
|
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. только что выполнил у себя(тестовый сервер, спецом куплен на плохом хостинге при создании системы ...дабы не работал быстро и стабильно) думаю понятно что произошло 54к записей время 0,686сек юзеров 7 штук.(разрабатываеться дело...:) ) Код: sql 1. 2. 3. в базе дерево папок храниться. 14 000 000+ записей, отрабатывает за 0,794сек (правда этот сервер побыстрее, не тестовый) insert on duplicate key. ... структуру таблиц покажи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2014, 16:34:54 |
|
||
|
REPLACE / INSERT ON DUPLICATE KEY без индекса UNIQUE
|
|||
|---|---|---|---|
|
#18+
BugaLol, ответ в лоб 1)влюбом случае храни все визиты...зачем же сгоряча рубить 2)на вставку визита отдельного, делаешь тригер, который добавит в агрегирующую таблицу 3) твоя делема. уникальным у меня щитаеться набор полей f1 f2 f3 - так и построй уникальный ключ по трём полям!!! Insert on update если для даной комбинации ещо небыло визита, будет вставка - дальше будет обновление :) при любом нарушении уникальности - будь то ключ по полю или по 50 полям. 4)ещо задумайся вот над чем. самая популярная операция статистики...смотреть за весь период? нет. более того, обновляться статистика будет только за текущие сутки. поэтому у тебя две таблицы - одна статистика, другая статистика сегодняшнего дня - тип таблицы мемори :) если у тебя запись одна пускай на 200 байт, плюс на индекс 100 байт, 300 байт на строку, 10000 записей, 3000 000 байт, я к тому что по памяти не сильно застратно будет. останеться задачка, как в конце суток переключатель сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2014, 17:10:23 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38669162&tid=1834681]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 321ms |

| 0 / 0 |
