Ето какво направих и намалих общото време за изпълнение с коефициент 10.
Това, което разбрах от плана за изпълнение на моята първоначална заявка, беше, че използва сортиране на файлове за сортиране на всички резултати и игнориране на индексите. Това е малко загуба.
Моята тестова база данни:5 M записа, 20 GB размер. структурата на таблицата е същата като във въпроса
Вместо да получавам blobCol директно в първата заявка, първо получавам стойността на 'name' за началото на всяка страница. Изпълнявайте тази заявка за неопределено време, докато не върне 0 резултата. Всеки път добавяйте резултата към списък
SELECT name
FROM my_table
where id = <anyId> // I use the id column for partitioning so I need this here
order by name
limit <pageSize * pageNumber>, 1
Номерът на страницата синус не е известен преди това, започнете със стойност 0 и продължете да увеличавате, докато заявката не върне нула. Можете също да направите избор на брой (*), но това само по себе си може да отнеме много време и няма да помогне за оптимизиране на нищо. Изпълнението на всяка заявка отнема около 2 секунди, след като броят на страницата надхвърли ~60.
За мен размерът на страницата беше 5000, така че получих списък с низове за име на позиция 0, 5001, 10001, 15001 и така нататък. Броят на страниците се оказа 1000 и съхраняването на списък от 1000 резултата в паметта не е скъпо.
Сега прегледайте списъка и изпълнете тази заявка
SELECT blobCol
FROM my_table
where name >= <pageHeader>
and name < <nextPageHeader>
and city="<any string>"
and id= 1
Това ще се изпълнява N пъти, където N =размерът на списъка, получен по-рано. Тъй като „име“ е основният ключ, а „град“ също се индексира, EXPLAIN показва, че това изчисление се извършва в паметта с помощта на индекса.
Сега всяка заявка се изпълнява за 1 секунда, вместо първоначалните 30-40. Така че комбинирайки времето за предварителна обработка от 2 секунди на страница, общото време на страница е 3-4 секунди вместо 30-40.
Ако някой има по-добро решение или ако има нещо очевидно нередно в това, моля, уведомете ме