Mysql
 sql >> база данни >  >> RDS >> Mysql

обработката на голям брой записи в базата данни с пейджинг се забавя с времето

Ето какво направих и намалих общото време за изпълнение с коефициент 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.

Ако някой има по-добро решение или ако има нещо очевидно нередно в това, моля, уведомете ме



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получаване на сходна дължина и ширина от базата данни

  2. Извършване на сравнение LIKE на поле INT

  3. Как да преброя NULL стойности в MySQL?

  4. Производителност на MySQL:Идентифициране на дълги заявки

  5. Проследяване на времето за заявки в DB - Bookshelf/knex