Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Посоветуйте структуру таблиц и индексов Юзер вызывает приложение - username, date, form_id - это уже храним в виде полной истории в обычной таблице. Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него. Но не чувствую, где будут тормоза и будут ли. Сколько будет строк в полной истории - скажем, порядка десяти лямов. Сколько инсертов в час - до десяти тысяч. Цифры фонарные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 07:23 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
поправил чуть Посоветуйте структуру таблиц и индексов Юзер вызывает приложение - username, date, form_id - это уже храним в виде полной истории в обычной таблице. Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него за последние две недели . Но не чувствую, где будут тормоза и будут ли. Сколько будет строк в полной истории - скажем, порядка десяти лямов. Сколько инсертов в час - до десяти тысяч. Цифры фонарные Какие нужны индексы, или вообще новые таблицы История - шесть последних - может, вообще строкой хранить? usernnameList_Form_idВася1,2,3,4,5,6Петя1,3,2,5,8Тогда при вставке истории читаем строку, отрезаем последний элемент, вставляем спереди самый свежий Шесть популярных - сделать аналого полной истории, только чистить раз в сутки ночью всё, что старше 2 недель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 07:52 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
andreymxПосоветуйте структуру таблиц и индексов Поля таблицы: - ИД пользователя, FK на таблицу пользователей - Время события, дата-время - Событие, текст, либо ИД события, FK на таблицу событий Индекс: - составной, (ИД пользователя,Время события) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:08 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
andreymx, Я не разработчик, поэтому возможно я не прав, но я это так вижу. Таблица дата, имя, форма. Я бы сделал в качестве ключа кластерного, дата и имя. Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро. Самые популярные за две недели. В принципе тоже должен быстро отработать. Здесь вы в where задаете имя и дату, сгруппируете по form_id и посчитаете кол-во, потом выведете 6 самых популярных. В зависимости от запросов, возможно есть смысл добавить индекс просто по имени. Зависит от того насколько оно уникально и будут ли еще запросы кроме тех двух что назвали вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:09 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, Использовать ID пользователя как первый столбец в индексе, плохая идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:21 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
aleksrovAkina, Использовать ID пользователя как первый столбец в индексе, плохая идея.а чем плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:25 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
aleksrovЯ бы сделал в качестве ключа кластерного, дата и имя. Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.Если сделать первым дату - индекс практически не будет работать. Ведь выбираются записи для конкретного пользователя. andreymx , в принципе, можно рассмотреть предрасчёт "популярности" - таблица (юзер-событие-количество, индекс юзер-количество), обновляемая триггером на таблице журнала событий. И получать вторую суб-выборку из этой таблицы. aleksrovИспользовать ID пользователя как первый столбец в индексе, плохая идея.??? обоснуй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:33 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, Будут постоянные сплиты, это раз. И два, с чего это он не будет работать? В особенности для второго запроса, за последнии две недели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:38 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
aleksrovВ особенности для второго запроса, за последнии две недели? Читаем вопрос: andreymxШесть последних вызванных им приложений и шесть популярных для него Теперь ищем про "две недели", и находим: andreymx Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него за последние две недели . обращаем внимание на подчёркнутое. Понимаем, что за две недели автору не надо . aleksrovБудут постоянные сплитыИ? особенно с учётом фильтрации по одному конкретному юзеру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:57 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, Тогда согласен. Но причем тут фильтрация и сплиты? При таком индексе тогда FillFactor для него не по умолчанию делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 09:03 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, сорри, есть дисбаланс между заголовком темы и хотелками нужны шесть самых популярных именно за последние две недели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 09:08 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Попробывал. Создал таблицу, 10 лямов, 30 пользваотелей, 15 приложений, временной промежуток год. SQL делает seek что в варианте с User первый, что с Date, планы одинаковые. Но с Date в три раза медленнее выполняется и делает в 10 раз больше лог. чтений. Акина прав. Но в таком случае тогда Fillfactor не по умолчанию нужно ставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 09:26 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
andreymxнужны шесть самых популярных именно за последние две неделиНу ещё одно условие во WHERE... на что это влияет-то? aleksrovНо причем тут фильтрация и сплиты?Про сплиты как бы не я заговорил. Что же до фильтрации... чтобы выбрать последние, нужна сортировка, а она выполняется после фильтрации. В первом приближении (фиг знает, как на самом деле будет всё нужное делать сервер): - если первым в индексе стоИт юзер - сервер читает немножко блоков из индекса для заданного юзера, причём уже сортированных по дате, и последовательно выгребает записи в порядке уменьшения даты, фильтруя дубликаты (если задано найти уникальные приложения). - если первой стоИт дата - сервер будет читать дофига блоков, фильтруя юзеров (и, если задано, приложения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 09:27 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, Понятно. Здесь зависит сколько данных есть в каком блоке. Если юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру. Попробывал кстати вставку. Вставил 10 000 строк, 80 сплитов, по времени на процентов 20 где-то медленее. Поставил FillFactor 90, 2 сплита, скорость такая же как и без сплитов. Но у автора, опять же примерно, это кол-во вставок за час, а не за минуту. Вывод. Как посоветовали вы и FillFactor 90. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 09:51 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
aleksrovЕсли юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру.Сильно сомневаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 10:25 |
|
||
|
Шесть последних и шесть популярных
|
|||
|---|---|---|---|
|
#18+
Akina, Попробывал, 30% строк все один пользватель, разницы практически нет, если за последнии две недели считай работал этот юзер. Блин, я ужасно тупил. Все логично. Если у нас индекс по юзеру, и мы ищем за последнии две недели, sql точно также смотрит промежуточный уровень, данные сначала идут по юзеру, потом дате, он смотрит на какой странице начинаются эти последнии две недели, так как второй столбец тоже есть в промежуточном уровне, и начинает оттуда читать. Он не сканит все страницы для юзера (я почему то думал что он сделает именно это) Итог 140 чтений. Если же дата первая... Я начала добавлять данные за последнии две недели для разных пользователей, чем больше добавлял, тем больше было чтений, и это логично. В промежуточном уровне указана минимальная дате на странице и связаный с ней юзер, так как наш юзер "раскидан" по всем страницам, sql должен прочитать все данные за последнии две недели. Вобщем я ошибался, спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 11:18 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39636525&tid=1689845]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
110ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 462ms |

| 0 / 0 |
