|
|
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
1. В MySQL в оператор IN список какой мксимальной длины можно втюхать ? Скажем, в списке будут числа от 1 и далее. И таких чисел будет 1000. Справится ? А если 1 000 000 ? 2. Использует ли MySQL индексацию IN-списка перед выполнением запроса ? Ведь в противном случае ему придётся для каждой записи последовательно сравнивать некоторое значение с каждым значением из списка. А в случае с индексацией на каждой записи он будет сразу искать по индексу. Наверняка индексирует, но на всякий уточнить не мешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:53:23 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_021. В MySQL в оператор IN список какой мксимальной длины можно втюхать ? Скажем, в списке будут числа от 1 и далее. И таких чисел будет 1000. Справится ? А если 1 000 000 ? 2. Использует ли MySQL индексацию IN-списка перед выполнением запроса ? Ведь в противном случае ему придётся для каждой записи последовательно сравнивать некоторое значение с каждым значением из списка. А в случае с индексацией на каждой записи он будет сразу искать по индексу. Наверняка индексирует, но на всякий уточнить не мешает. 1) Насколько я помню, лимитирует только max_allowed_packet. 2) Строит бинарное дерево из списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:56:19 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
автор1) Насколько я помню, лимитирует только max_allowed_packet. Из справки : автор The maximum size of one packet or any generated/intermediate string. The packet message buffer is initialized to net_buffer_length bytes, but can grow up to max_allowed_packet bytes when needed. This value by default is small, to catch large (possibly incorrect) packets. You must increase this value if you are using large BLOB columns or long strings. It should be as big as the largest BLOB you want to use. The protocol limit for max_allowed_packet is 1GB. The value should be a multiple of 1024; nonmultiples are rounded down to the nearest multiple. When you change the message buffer size by changing the value of the max_allowed_packet variable, you should also change the buffer size on the client side if your client program permits it. The default max_allowed_packet value built in to the client library is 1GB, but individual client programs might override this. For example, mysql and mysqldump have defaults of 16MB and 24MB, respectively. They also enable you to change the client-side value by setting max_allowed_packet on the command line or in an option file. The session value of this variable is read only. ... Так строка после IN относится к этому самому "packet or any generated/intermediate string" ? автор2) Строит бинарное дерево из списка. Тогда скорость выполнения оператора IN на каждой записи расти будет очень медленно по сравнению с ростом числа элементов в списке. Скажем, при увеличении числа элементов в списке на 3 порядка (например, с 1000 до 1000 000) удельная скорость уменьшится на 1 порядок. Вроде, так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 16:41:39 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Тогда скорость выполнения оператора IN на каждой записи расти будет очень медленно по сравнению с ростом числа элементов в списке. Скажем, при увеличении числа элементов в списке на 3 порядка (например, с 1000 до 1000 000) удельная скорость уменьшится на 1 порядок. Вроде, так.Не так. Время выполнения оператора IN будет расти очень медленно. И при увеличении с 1000 до 1000 000 элементов это время вырастет вдвое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 16:49:45 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
miksoftИ при увеличении с 1000 до 1000 000 элементов это время вырастет вдвое.Хотя общее время выполнения запроса будет расти намного быстрее. Например, расходы на парсинг будут расти линейно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 16:51:36 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
авторХотя общее время выполнения запроса будет расти намного быстрее. Например, расходы на парсинг будут расти линейно. Так парсинг будет выполняться только 1 раз для всего запроса. Скажем, в запросе нужно для 10 000 000 записей проверить вхождение (IN) в список из 1 000 000 чисел. Время, затрачиваемое на парсинг каждого дополнительного числа в IN-списке, гораздо меньше времени, затрачиваемого на выпоkнение оператора IN для одной записи (или не так ?). В итоге только лишь при удвоении длины IN-списка при фиксированном числе записей время выполнения запроса вырастет не более чем в я раза. Так или нет ? если прикинуть ? 2 варианта: 1) 10 000 000 записей и IN-список из 1 000 000 чисел 2) 10 000 000 записей и IN-список из 2 000 000 чисел Во втором случае примерно во сколько раз увеличится время выполнения запроса, если принимать во внимание только длину списка ? Т.е. считаем, что скорость прохода дерева (выполнения оператора IN) не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 22:32:03 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Мне почему-то кажется, что IN-список даже из 100 элементов правильнее поместить во временную таблицу и в запросе заменить на обычный JOIN Если же в списке более 1000 элементов, то перед JOIN было бы хорошо еще и проиндексировать временную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2013, 09:09:50 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_021. В MySQL в оператор IN список какой мксимальной длины можно втюхать ? Скажем, в списке будут числа от 1 и далее. И таких чисел будет 1000. Справится ? А если 1 000 000 ? Как-то странно пихать в список миллион значений, как и просматривать миллион записей. К тысяче записей это относится в той же мере. Cyrax_022. Использует ли MySQL индексацию IN-списка перед выполнением запроса ? Ведь в противном случае ему придётся для каждой записи последовательно сравнивать некоторое значение с каждым значением из списка. А в случае с индексацией на каждой записи он будет сразу искать по индексу. Наверняка индексирует, но на всякий уточнить не мешает. Обычно запросы такого рода делают N позиционирований по индексу (если конечно поле индексировано) и затем объединяют всё в один результат. Как это делает MySQL я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2013, 11:45:43 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, не буду утверждать наверняка, но кажется что он предварительно сортирует список по возрастанию, убирая из него дубликаты и только потом загоняет его в запрос для позиционирования по индексу (если он есть конечно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2013, 12:51:51 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Вот ещё кое-что по сабжу. А именно - замеры скорости выполнения запросов с IN: http://habrahabr.ru/qa/22419/#answer_91895 Результаты очень неплохие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2013, 18:55:30 |
|
||
|
Максимальная длина списка в операторе IN ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Вот ещё кое-что по сабжу. А именно - замеры скорости выполнения запросов с IN: http://habrahabr.ru/qa/22419/#answer_91895 Результаты очень неплохие.Зато тестирование плохое. Настолько плохое, что имеет ценность ниже нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2013, 19:21:17 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1835841]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 331ms |

| 0 / 0 |
