Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Есть список сессий пользователей, в котором основным идентификатором является MAC-адрес пользователя. MAC-адрес хранится в БД как BINARY(6). Сессии могут быть актуальными (действующими) и неактуальными (завершенными), для чего в каждой сессии есть поля START и STOP, определяющие начало и конец действия сессии. В действующих сессиях MAC-адрес должен быть уникальным. Однако в завершенных сессиях разрешается его неуникальность, там ожидаются сотни и тысячи дубликатов. Значения MAC-адресов случайны, но на гистограмме будут заметно выражены группировки по первым 3-4 байтам. Я сделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. У актуальных сессий выставляется ACTIVE=1, у неактуальных выставляется ACTIVE=null. Задумка в том, что null-значения (ACTIVE=null) в индекс не попадают, соответственно дубликаты разрешаются. А записи с заполненным ACTIVE попадают в уникальный индекс и срабатывает ограничение по неуникальности. Задумка правильная или я что-то не учитываю? Если правильная, то какой лучше выбрать индекс, HASH или BTREE? Я так понимаю, что записи с ACTIVE=null вообще не будут попадать в индекс, а для актуальных сессий MAC-адреса должны неплохо балансироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 22:58 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Alibek B.Задумка в том, что null-значения (ACTIVE=null) в индекс не попадают , соответственно дубликаты разрешаются. А записи с заполненным ACTIVE попадают в уникальный индекс и срабатывает ограничение по неуникальности. Задумка правильная или я что-то не учитываю?В MySQL выделенное не работает, насколько я помню. Нечто близкое есть в Оракле. Там в индекс не попадают записи, в которых NULL во всех полях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 23:11 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Вот, нашел в доке: https://dev.mysql.com/doc/refman/5.7/en/create-table.html For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL. Можно выкрутиться, если сделать уникальный индекс из одного поля ACTIVE, а в это поле писать сам MAC. Т.е. для активных сессий это поле будет временно дублировать поле MAC. Или, если логику поля менять уже нельзя и если версия MySQL позволяет, то можно сделать Generated Column с такой логикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 23:23 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
miksoftВ MySQL выделенное не работает, насколько я помню. Э... Я как-бы проверил. Добавляю две записи ACTIVE=null,MAC=0x111111111111 — успешно. Добавляю две записи ACTIVE=1,MAC=0x222222222222 — ошибка добавления второй записи, неуникальность. Если в первой записи (MAC=0x111111111111) в поле ACTIVE пишу 1, то для одной записи получается, для второй ошибка неуникальности. У меня MariaDB, может быть в этом отличие от MySQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 23:55 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Alibek B.Добавляю две записи ACTIVE=null,MAC=0x111111111111 — успешно.А как проверяли, что записи в индекс не попали? Насколько я понимаю, в индекс записи попали (хотя не могу найти деталей в доке для полной уверенности), но констрейнт на уникальность не сработал. Кстати, записи вствляли с указанием слова IGNORE или нет? Впрочем, вроде бы это именно то поведение, которое вам надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 23:11 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
miksoftНасколько я понимаю, в индекс записи попали (хотя не могу найти деталей в доке для полной уверенности)Отсутствие ссылки на запись в индексе - это разрушение индекса. Не думаю, что такие вещи требуют отдельного описания... например, не будь в нём ссылок, индекс не мог бы использоваться для запросов с проверкой поля на Null. miksoftконстрейнт на уникальность не сработал.Почему? всё нормально сработало... просто (Null = Null) IS NULL. А NULL-safe compare в индексах не предусмотрено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 08:54 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
AkinaПочему? всё нормально сработало... просто (Null = Null) IS NULL. А NULL-safe compare в индексах не предусмотрено. Да, видимо так. Но главное, что ограничение работает так, как мне нужно: для заданного ACTIVE уникальность MAC обеспечивает БД, для незаданного ACTIVE разрешаются повторы MAC. А какой тип индекса будет оптимальным, хеш или сбалансированное дерево? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 09:30 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Alibek B.какой тип индекса будет оптимальным, хеш или сбалансированное дерево?Ооо... холивару захотел? не надо... лучше проверь экспериментально... опять же зависит от того, нафига... В общем случае я бы начал экспериментировать с хэша по комбинации (MAC, active) или наоборот, в зависимости от того, какие типы запросов превалируют или критичны по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 10:48 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
AkinamiksoftНасколько я понимаю, в индекс записи попали (хотя не могу найти деталей в доке для полной уверенности)Отсутствие ссылки на запись в индексе - это разрушение индекса. Не думаю, что такие вещи требуют отдельного описания... например, не будь в нём ссылок, индекс не мог бы использоваться для запросов с проверкой поля на Null.Ну в Оракле-то так и происходит, если в какой-то записи все поля индекса IS NULL, то запись в индекс физически не попадает. И проверка на WHERE ... IS NULL не может использовать этот индекс. Т.е. такой подход тоже существует в природе. И в некоторых случаях на этом можно удачно сыграть. Akinamiksoftконстрейнт на уникальность не сработал.Почему? всё нормально сработало... просто (Null = Null) IS NULL. А NULL-safe compare в индексах не предусмотрено."Не сработал" не в смысле "не проверялся", а в смысле "не вызвал ошибку". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 00:49 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
Akinaс хэша по комбинации (MAC, active)MAC - штука небольшая, хэш не очень-то и нужен. Или можно немного схитрить - не считать честный хэш от всего MAC-а, а просто взять два младших байта от него. От старших байтов все равно толку мало, они обычно очень низкоселективны. Физически это можно реализовать, например, разбиением MAC-а на два поля - UNSIGNED INT для старшей части и UNSIGNED SMALLINT для младшей. И в индекс включать только младшую часть. Тогда индекс "похудеет" на 4 байта на каждую запись. Впрочем, если оперативки с избытком, то это может оказаться неэффективным, т.к. индекс в любом случае будет умещаться в кэш и лишние чтения из таблицы будут только мешать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 01:00 |
|
||
|
Посоветуйте оптимальный составной индекс с null-полем
|
|||
|---|---|---|---|
|
#18+
AkinaAlibek B.какой тип индекса будет оптимальным, хеш или сбалансированное дерево?Ооо... холивару захотел?А не будет никакого холивару. https://dev.mysql.com/doc/refman/5.7/en/create-index.html#create-index-storage-engine-index-types Table 13.1 Index Types Per Storage Engine Storage Engine Permissible Index TypesInnoDBBTREEMyISAMBTREEMEMORY/HEAP HASH; BTREENDB HASH; BTREE (see note in text) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 01:04 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39471993&tid=1830610]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 136ms |

| 0 / 0 |
