|
|
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Есть таблица: mac_prefixdescription11:22:33:44:55:66host11:22:33:44:group111:22:33:supergroup111:scope Есть определенный MAC-адрес <mac> и его нужно классифицировать по всем соответствующим записям. Вопрос первый — какой запрос лучше? 1. select * from mac_prefixes where <mac> like concat(mac_prefix,'%') 2. select * from mac_prefixes where mac_prefix = left(<mac>,length(mac_prefix)) 3. Варианты п.2 с другими функциями вместо left (instr, substr или другое) Ну и второй вопрос — помогут ли тут индексы? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 09:42:40 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Эти запросы примерно равноценны и все они не будут использовать индексы. Можно примерно так: Код: sql 1. 2. 3. где константы - фрагменты искомого мака. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:16:58 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Alibek B., 1)все варианты хреновые, т.к. 2)индексы к ним не подцепятся Предлагаю растащить <mac> на куски, которые могут встречаться в префиксах - в вашем примере это 6,4,3 и 1 байт -, после чего делать несколько запросов с прямым сравнением (ну или объединить их в один через union all). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:18:51 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
tanglirчерез union allмда, через in оно получше будет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:19:43 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
С in не получится, потому что как раз список префиксов динамический и может быть довольно большим. А почему во втором варианте индекс не будет использоваться? Ведь это field=expression, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:21:51 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
miksoftгде константы - фрагменты искомого мака. А, понял. То есть на клиенте вместо MAC-адреса получить шесть его фрагментов и использовать их. Да, такое подходит, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:23:52 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
tanglirtanglirчерез union allмда, через in оно получше будет :)Не уверен, надо пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:29:08 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
miksoft, ну шанс на использование индекса вроде такой же, как и в юнион-варианте а проход будет всего один, в отличие от ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:31:59 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
tanglirmiksoft, ну шанс на использование индекса вроде такой же, как и в юнион-варианте а проход будет всего один, в отличие от"проходов" (сканов) при наличии индекса не будет ни одного в обоих вариантах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 10:42:56 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
miksoft, проходов по индексу будет 4 (столько, сколько будет вариантов мак-суффикса) в случае с юнионом и всего один в случае с ином ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 11:00:33 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
tanglirmiksoft, проходов по индексу будет 4 (столько, сколько будет вариантов мак-суффикса) в случае с юнионом и всего один в случае с иному нас разные трактовки слова "проход" :) для меня это table/index scan а в обсуждаемых запросах будет index seek И, кстати, почему с IN будет только один "проход"? MySQL же не может быть уверен, что константы в IN находятся в индексе подряд или даже в одной ветке индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 11:19:32 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Alibek B.Есть таблица: mac_prefixdescription11:22:33:44:55:66host11:22:33:44:group111:22:33:supergroup111:scope Есть определенный MAC-адрес <mac> и его нужно классифицировать по всем соответствующим записям. Вопрос первый — какой запрос лучше? 1. select * from mac_prefixes where <mac> like concat(mac_prefix,'%') 2. select * from mac_prefixes where mac_prefix = left(<mac>,length(mac_prefix)) 3. Варианты п.2 с другими функциями вместо left (instr, substr или другое) Ну и второй вопрос — помогут ли тут индексы?Что-то такого типа (допускающее использование индекса): 3.select * from mac_prefixes where mac_prefix >= '11:22:33:' and mac_prefix < '11:22:34:' И непонятно, что такое <mac> - поле другой таблицы? константа? еще что-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:44:18 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Судя по тексту предлагавшихся ТСом запросов, константа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:45:30 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Константа или параметр. Cygapb-0073.select * from mac_prefixes where mac_prefix >= '11:22:33:' and mac_prefix < '11:22:34:' Почему '11:22:33:' и '11:22:34:', а не '11:22:33:44:' и '11:22:33:45:' или '11:' и '12:'? А также этот запрос не учитывает того, что мне нужно получить все префиксы, соответствующие MAC-адресу (с сортировкой по длине mac_prefix). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:07:06 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Конвертируйте МАС в, скажем, bigint. Префикс - соответственно в пару от-до. И запрос станет простым и быстрым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:07:29 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
AkinaКонвертируйте МАС в, скажем, bigint. Префикс - соответственно в пару от-до. И запрос станет простым и быстрым.Простым - может быть. Быстрым - не быстрее, имхо, моего варианта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:10:58 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
AkinaКонвертируйте МАС в, скажем, bigint. Префикс - соответственно в пару от-до. И запрос станет простым и быстрым. Вообще-то он у меня varbinary(6). В принципе можно и в bigint преобразовать. То есть предлагаете использовать такую таблицу префиксов: mac_frommac_todescription11:22:33:44:55:6611:22:33:44:55:66host11:22:33:44:00:0011:22:33:44:FF:FFgroup111:22:33:00:00:0011:22:33:FF:FF:FFsupergroup111:00:00:00:00:0011:FF:FF:FF:FF:FFscope Да, тоже выход. Но заполнение таблицы усложнится и возможны коллизии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:11:18 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Alibek B.Константа или параметр. Cygapb-0073.select * from mac_prefixes where mac_prefix >= '11:22:33:' and mac_prefix < '11:22:34:' Почему '11:22:33:' и '11:22:34:', а не '11:22:33:44:' и '11:22:33:45:' или '11:' и '12:'? А также этот запрос не учитывает того, что мне нужно получить все префиксы, соответствующие MAC-адресу (с сортировкой по длине mac_prefix).Тогда, наверное, вот так? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. и индекс работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:31:31 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Alibek B.AkinaКонвертируйте МАС в, скажем, bigint. Префикс - соответственно в пару от-до. И запрос станет простым и быстрым. Вообще-то он у меня varbinary(6). В принципе можно и в bigint преобразовать. То есть предлагаете использовать такую таблицу префиксов: mac_frommac_todescription11:22:33:44:55:6611:22:33:44:55:66host11:22:33:44:00:0011:22:33:44:FF:FFgroup111:22:33:00:00:0011:22:33:FF:FF:FFsupergroup111:00:00:00:00:0011:FF:FF:FF:FF:FFscope Да, тоже выход. Но заполнение таблицы усложнится и возможны коллизии. 1) VarBinary для этой задачи - смерть. 2) Заполнение не усложнится - просто потребуются пара пользовательских функций преобразования. 3) Запрoс будет тупо between, и выполняться должен быстро при правильной индексации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:34:18 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Ну а коллизии... их не должно быть при правильном проектировании заполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:35:24 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Блин... это ж МАКи, а не IPv6, т.е. реально префиксы, а не диапазоны... Всё вышесказанное - фтопку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:39:45 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
AkinaБлин... это ж МАКи, а не IPv6, т.е. реально префиксы, а не диапазоны... Всё вышесказанное - фтопку.Почему же? Имхо, Ваш вариант тоже вполне имеет право на жизнь. По крайней мере в рамках текущей задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:51:38 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
miksoftAkinaБлин... это ж МАКи, а не IPv6, т.е. реально префиксы, а не диапазоны... Всё вышесказанное - фтопку.Почему же? Имхо, Ваш вариант тоже вполне имеет право на жизнь. По крайней мере в рамках текущей задачи.Согласен, да и поиск по двум int быстрее, чем по varchar(23) (=6*3+5) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:00:52 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
Cygapb-007да и поиск по двум int быстрее, чем по varchar(23) (=6*3+5)Не понял откуда цирфы. Имхо, надо сравнивать 2*bigint и 6*2+5+1 (6 пар цифр, 5 двоеточий, байт длины), т.е. 16<18. При максимальном заполнении разница в пользу 2*bigint, но незначительная. При продемонстрированном заполнении разница явно будет в пользу строк. Если уж минимизировать расходы, то хранить префикс в bigint и отдельно байт длины. Будет всего 9 байт. И это еще не предел... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:10:34 |
|
||
|
Подскажите, как организовать БД (таблицу) для запросов с like
|
|||
|---|---|---|---|
|
#18+
miksoftCygapb-007да и поиск по двум int быстрее, чем по varchar(23) (=6*3+5)Не понял откуда цирфы. Имхо, надо сравнивать 2*bigint и 6*2+5+1 (6 пар цифр, 5 двоеточий, байт длины), т.е. 16<18. При максимальном заполнении разница в пользу 2*bigint, но незначительная. При продемонстрированном заполнении разница явно будет в пользу строк. Если уж минимизировать расходы, то хранить префикс в bigint и отдельно байт длины. Будет всего 9 байт. И это еще не предел...FF:FF:FF:FF:FF:FF => 255:255:255:255:255:255 - максимальное значение Ну, плюс байт длины, забыл :) =6*3+5+1=24 Но он в varchar неявный, потому varchar(23) А хотя да, where @mac between mac_from and mac_to вынужденно будет читать все mac_from <= @mac ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:25:14 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38401137&tid=1836014]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
80ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 433ms |

| 0 / 0 |
