Индексируется 15 миллионов клиентов, но запрос все еще занимает почти 5 минут, чтобы вернуть результаты - PullRequest
0 голосов
/ 26 июня 2018

У меня есть 15 миллионов данных о клиентах в 3 столбцах и индексированных столбцах в каждом:

  1. клиентов
    • Index ix_disabled_customer_id on zen_customers(customers_id, disabled);
  2. customer_attribute
    • Index ix_attribute_id_and_name on zen_customers (attribute_id, attribute_name);
  3. customer_attribute_value.
    • Index ix_attribute_id_and_customer_id on `zen_customers`(customers_id, attribute_id);

Я пытаюсь отфильтровать клиентов по полу, и для возврата результатов требуется слишком много времени.

Подписанэто запрос

SELECT tcav.customers_id AS customers_id 
FROM customer_attribute_value tcav
JOIN customer_attribute tca
JOIN customers zc
WHERE tcav.attribute_id = tca.attribute_id
    AND tca.attribute_name = "Gender"
    AND tcav.attribute_value = "M"
    AND zc.customers_id = tcav.customers_id
    AND  zc.disabled = 0;

Изображение добавлено для Объясненного Расширенного плана

Было бы очень полезно, если бы я мог получить идеи по оптимизации этой фильтрации.Спасибо

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

EAV схема имеет много проблем.В этом случае вы тратите много времени и пространства на поиск «пола», когда он мог бы более просто находиться в основной таблице.

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

Следуйте тегу [entity-attribute-value] для дальнейшего освещения.

Пока вы серьезно не обновите схему, производительность будет ухудшаться от плохой до ужаснойпо мере роста данных.

0 голосов
/ 26 июня 2018

Во-первых, рекомендуется использовать предложения ON вместо предложения WHERE для объединения таблиц.Маловероятно, что это повлияет на производительность, но помогает улучшить представление о том, какие столбцы связаны с какими таблицами.

SELECT tcav.customers_id AS customers_id 
FROM tulip_customer_attribute_value tcav
JOIN tulip_customer_attribute tca
ON tcav.attribute_id = tca.attribute_id
JOIN zen_customers zc
ON zc.customers_id = tcav.customers_id
WHERE tca.attribute_name = "Gender"
AND tcav.attribute_value = "M"
AND zc.disabled = 0

Добавьте следующие индексы:

tulip_customer_attribute (attribute_name,attribute_id)

tulip_customer_attribute_value (attribute_id,attribute_value,customers_id)

Порядокиз столбцов в индексах важно.

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