Nano Hash - криптовалюты, майнинг, программирование

Разбиение на страницы результатов объединения двух таблиц

У меня проблема с разбиением на страницы двух больших таблиц:

Receipts table: id, receipt_date, record_details (650k records)
Z Reports table: id, receipt_date, record_details (88k records)

Что я хочу сделать, так это отсортировать обе эти таблицы по receipt_date и объединению, после чего я хочу разбить их на страницы. В настоящее время у меня есть этот SQL (не совсем так, но основная идея такова):

SELECT c.id, c.receipt_date, c.col_type FROM (
    SELECT a.id, a.receipt_date, 'receipt' AS coltype 
        FROM `terminal_receipts` a
        WHERE `a`.`deleted` IS NULL 
    UNION ALL
        SELECT b.id, b.receipt_date, 'zreport' AS coltype 
        FROM z_reports` b WHERE `b`.`deleted` IS NULL
) c
ORDER BY receipt_date desc LIMIT 50 OFFSET 0

Таким образом, сервер выбирает все записи из двух таблиц, упорядочивает их по дате, а затем применяет нумерацию страниц.

Но когда количество строк увеличивается, этот запрос будет выполняться дольше. Есть ли другой алгоритм для получения того же результата, не зависящий от размера таблицы?


Ответы:


1

Существует метод под названием Seek Method, вы можете прочитать о здесь. В соответствии с ним вам нужно определить набор столбцов, который однозначно идентифицирует каждую строку. Затем этот набор столбцов будет использоваться с предикатом при поиске в базе данных.

В ссылке, которую я упомянул, есть несколько примеров, но вот еще один, очень простой:

CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `rev` int(3) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`,`rev`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `rev`, `content`) VALUES
  ('1', '1', 'The earth is flat'),
  ('2', '1', 'One hundred angels can dance on the head of a pin'),
  ('1', '2', 'The earth is flat and rests on a bull\'s horn'),
  ('1', '3', 'The earth is like a ball.');

SELECT *
FROM `docs`
ORDER BY rev, id
LIMIT 2;


SELECT * 
FROM `docs`
WHERE (rev, id) > (1, 2) # let's use the last row from the previous select with the predicate
ORDER BY rev, id
LIMIT 2;

SELECT * 
FROM `docs`
WHERE (rev, id) > (3, 1) # same idea
ORDER BY rev, id
LIMIT 2;

Ссылка на SQLFiddle

Наличие индексов еще больше ускорит разбиение на страницы.

Надеюсь, это поможет.

22.04.2019
  • Спасибо за ответ, но порядок основан на дате и времени, и есть две таблицы, которые мне тоже не очень помогают. например, если я их проиндексирую, это может быть z1 r1 r2 r3 z2 r4 r5 r6 r7 r8 z3 и т. д., и мне понадобятся два маркера. 22.04.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..