Использование индекса в производной таблице UNION ALL и многих базах данных - PullRequest
0 голосов
/ 26 января 2019

У меня есть дизайн базы данных, который имеет отдельную базу данных для отдельных данных клиентов. База данных имеет таблицу данных, которая в данный момент содержит за один месяц ~ 4 миллиона строк.

Для запросов я создаю пользовательские представления, которые сопоставляют идентификатор клиента с конкретной базой данных. Виды выглядят так:

CREATE ALGORITHM = MERGE VIEW DataView AS

SELECT
  100 AS CustomerID,
  c1db.Data.*
FROM
  Customer100_DB c1db

UNION ALL

SELECT
  101 AS CustomerID,
  c2db.Data.*
FROM
  Customer101_DB c2db;

Теперь мои запросы обычно выглядят так:

  SELECT COUNT(*) FROM DataView WHERE CustomerID = ... AND ....;

Моя проблема заключается в том, что соответствующий индекс в таблице данных не используется при запросе представления, если оно содержит как минимум 2 базы данных. То есть при удалении [...] UNION ALL SELECT ... [...] из представления используется точный индекс или при прямом запросе к таблице данных. Есть ли здесь проблема с дизайном, или я могу дать оптимизатору больше шансов снизить индекс (используя MariaDB 10.3)?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вы можете попробовать использовать индексные подсказки: https://dev.mysql.com/doc/refman/8.0/en/index-hints.html Итак, ваш синтаксис может быть:

CREATE ALGORITHM = MERGE VIEW DataView AS
SELECT
100 AS CustomerID,
c1db.Data.*
FROM
Customer100_DB c1db USE INDEX (col1_index,col2_index)
UNION ALL
SELECT
101 AS CustomerID,
 c2db.Data.*
FROM
Customer101_DB c2db USE INDEX (col1_index,col2_index);
0 голосов
/ 26 января 2019

Индексы и представления просто не работают в MySQL / MariaDB, хотя они становятся лучше.

Я бы посоветовал вам объединить все данные в одну таблицу.Вы можете разделить данные по клиенту, если большинство запросов будут относиться к одному клиенту.

Имея данные в одной таблице, вы можете использовать индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...