Це гарна ідея / підхід до індексації стовпця VARCHAR?


32

Ми використовуємо PostgreSQL v8.2.3.

Існують таблиці: EMPLOYEE та EMAILLIST .

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)

2 таблиці з'єднані таким чином, що якщо або EMPLOYEE.EMAIL1, або EMPLOYEE.EMAIL2 не мають відповідного запису, ці рядки будуть повернуті.

SELECT employee.email1, employee.email2,
        e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
   FROM employee
   LEFT JOIN emaillist e1 ON e1.email = employee.email1
   LEFT JOIN emaillist e2 ON e2.email = employee.email2
 WHERE e1.email IS NULL OR e2.email IS NULL

Колонка EMAILякий є VARCHAR (256) з EMAILLISTтаблиці індексується. Тепер час відповіді - 14 секунд.

Статистика підрахунку таблиць: На даний момент EMPLOYEE має 165,018 записів, а EMAILLIST має 1810,228 записів, і в майбутньому очікується зростання обох таблиць.

  1. Це гарна ідея / підхід до індексації стовпця VARCHAR? Це питання негайно вразило мене через те, що ми не індексували стовпець VARCHAR у нашій програмі. Порада / пропозиція експертів щодо цього високо оцінені.
  2. За допомогою цього поточного запиту та індексу час відповіді 14 секунд є розумним чи є можливість для подальшої настройки? Що таке досвід / думка інших користувачів у реальному часі на основі такого розміру таблиці та часу відгуку?

ПРИМІТКА . Тут детально пояснюється моя фактична потреба / випадок використання .

Відповіді:


25

Немає нічого поганого в індексації стовпчика varchar, якщо ви збираєтеся робити запити на його основі. Однак майте на увазі, що є обмеження на деякі індекси та скільки вони можуть індексувати в одному полі. Наприклад, ви не можете індексувати стовпчик, який може містити необмежену кількість тексту. Однак ви повинні мати можливість робити індекс на varchar (256) без проблем. Спробуйте і проаналізуйте покращення в роботі ваших запитів, щоб побачити, чи допомагає це.


Дякуємо за ваш цінний коментар Чи є можливість для подальшої настройки мого запиту з цього приводу, щоб зменшити час відповіді з 14 секунд?
Гнанам

2
Без результатів EXPLAIN неможливо сказати, що оптимізувати. Версія 8.2.3 також застаріла, вам слід оновити до нової версії, ви відстали на 4 роки в обслуговуванні. Версії 8.3, 8.4 і 9.0 також більш швидкі у багатьох ситуаціях. Краща статистика також допомагає досягти ефективності.
Френк Хайкенс

5

Не існує проблеми з індексацією стовпчика varchar як такої

Де це може стати проблемою, якщо у таблиці з мільярдом рядків у вас стовпчик varchar як FK. Тоді у вас буде сурогатний ключ для ПК та FK, але вам все одно знадобиться унікальне обмеження / індекс природного ключа варчара.

Ваших таблиць досить мало, і продуктивність може бути пов’язана з пунктом АБО. На жаль, те саме питання застосовується незалежно від того, як ви структуруєте запит (і я недостатньо знайомий з PostgresSQL, щоб запропонувати дуже шкода)


0

Спробуйте позбутися частини запиту "АБО e2.email IS NULL" і подивіться, наскільки швидко він працює. Якщо вона працює швидше, можливо, ви зможете запустити її швидше за допомогою "об'єднання всіх"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.