Ocularis
Новичок
В общем пришлось мне как то столкнуться с такой задачей:
Есть массив ARR [1213,4584965165,5552654,...] из 3000-5000 значений, состоящий из 1-15 значных целых чисел, часто повторяющихся.
Есть таблица, в ней 2,5 миллиона строк, примерного вида:
... и так далее. и ID и NUM не уникальны.
Есть вторая таблица с уникальными ID, вида:
В ней примерно 1,4 миллиона строк.
Задача следующая:
Нужно получить случайные WORD и соответствующие NUM в количестве изначального массива ARR (3000-5000).
но не просто совсем случайный, а те у которых NUM совпадает со значением из ARR, и id.table1=id.table2.
Обработав ARR можно получить примерно 300 уникальных целых чисел, по которым нужно сделать разноразмерную выборку.
Немного помучившись и протестировав 3 различных решения для случайной выборкой по условию. Вернулся к изначальному, хоть оно и считается самым медленным, но почему-то в моем частном случае оказалось быстрее всех (но не значительно).
Поскольку нам нужно получить совершенно разное количество строк из разных групп NUM, и потом еще сделать join с второй таблицой, ничего хитрее чем сделать в лоб не придумал.
И выполнение всего этого занимает примерно 22-25 секунд.
Еще пробовал воспользоваться вот таким решением, но прироста производительности оно не дало.
http://habrahabr.ru/post/207096/
Есть ли у кого идеи как можно решить это более правильным и быстрым решением?
Есть массив ARR [1213,4584965165,5552654,...] из 3000-5000 значений, состоящий из 1-15 значных целых чисел, часто повторяющихся.
Есть таблица, в ней 2,5 миллиона строк, примерного вида:
Код:
ID NUM
1 123
2 986565
3 8456321
3 123
3 986565
Есть вторая таблица с уникальными ID, вида:
Код:
ID WORD
1 стол
2 стул
3 шкаф
Задача следующая:
Нужно получить случайные WORD и соответствующие NUM в количестве изначального массива ARR (3000-5000).
но не просто совсем случайный, а те у которых NUM совпадает со значением из ARR, и id.table1=id.table2.
Обработав ARR можно получить примерно 300 уникальных целых чисел, по которым нужно сделать разноразмерную выборку.
Немного помучившись и протестировав 3 различных решения для случайной выборкой по условию. Вернулся к изначальному, хоть оно и считается самым медленным, но почему-то в моем частном случае оказалось быстрее всех (но не значительно).
Код:
SELECT t1.id,t1.num
FROM table1 t1
WHERE t1.num= :input1
ORDER BY rand()
LIMIT :input2
Код:
SELECT t2.word, z.num FROM (
(SELECT t1.id,t1.num
FROM table1 t1
WHERE t1.num= 1213
ORDER BY rand()
LIMIT 2)
UNION ALL
(SELECT t1.id,t1.num
FROM table1 t1
WHERE t1.num= 4584965165
ORDER BY rand()
LIMIT 4)
UNION ALL
(SELECT t1.id,t1.num
FROM table1 t1
WHERE t1.num= 5552654
ORDER BY rand()
LIMIT 70)
... и так еще 297 раз
) z LEFT JOIN table2 t2 ON z.id=t2.id
Еще пробовал воспользоваться вот таким решением, но прироста производительности оно не дало.
http://habrahabr.ru/post/207096/
Есть ли у кого идеи как можно решить это более правильным и быстрым решением?