Czy dobrym pomysłem / podejściem jest indeksowanie kolumny VARCHAR?

32

Używamy PostgreSQL v8.2.3.

W grę wchodzą tabele: PRACOWNICY i EMAILLIST .

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

2 tabele są połączone w taki sposób, że jeśli EMPLOYEE.EMAIL1 lub EMPLOYEE.EMAIL2 nie mają pasującego wpisu, wiersze te zostaną zwrócone.

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

Kolumna EMAILktóry VARCHAR (256) z EMAILLISTtabeli jest indeksowany. Teraz czas reakcji wynosi 14 sekund.

Statystyka liczby tabel: obecnie EMPLOYEE ma 165 018 rekordów, a EMAILLIST ma 1810 228 rekordów, i oczekuje się, że obie tabele wzrosną w przyszłości.

  1. Czy dobrym pomysłem / podejściem jest indeksowanie kolumny VARCHAR? To pytanie od razu przyszło mi do głowy z tego powodu, że nie zaindeksowaliśmy kolumny VARCHAR wcześniej w naszej aplikacji. Bardzo cenne są porady / sugestie ekspertów.
  2. Przy obecnym zapytaniu i indeksie czas odpowiedzi wynoszący 14 sekund jest rozsądny, czy jest też miejsce na dalsze dostrajanie? Jakie są wrażenia / opinie innych użytkowników w czasie rzeczywistym w oparciu o ten rozmiar tabeli i czas reakcji?

UWAGA: Moje rzeczywiste zapotrzebowanie / przypadek użycia jest szczegółowo wyjaśniony tutaj .

Gnanam
źródło

Odpowiedzi:

25

Nie ma nic złego w indeksowaniu kolumny varchar, jeśli zamierzasz wykonywać na niej zapytania. Należy jednak pamiętać, że niektóre indeksy mają ograniczenia i ile mogą indeksować w jednym polu. Przykład: nie można zaindeksować kolumny, która może zawierać nieograniczoną ilość tekstu. Jednak powinieneś być w stanie zrobić indeks na varchar (256) bez problemu. Wypróbuj i przeanalizuj poprawę wydajności zapytań, aby sprawdzić, czy to pomoże.

ksenoterracid
źródło
Dziękujemy za cenny komentarz. Czy istnieje możliwość dalszego dostosowania mojego zapytania w tym zakresie, aby skrócić czas odpowiedzi z 14 sekund?
Gnanam
2
Bez wyników z EXPLAIN nie można powiedzieć, co zoptymalizować. Wersja 8.2.3 jest również nieaktualna, powinieneś zaktualizować ją do nowszej wersji, masz 4 lata opóźnienia w konserwacji. Wersje 8.3, 8.4 i 9.0 są również szybsze w wielu sytuacjach. Lepsze statystyki również pomagają zwiększyć wydajność.
Frank Heikens
5

Nie ma problemu z indeksowaniem kolumny varchar jako takiej

Problemem może być sytuacja, gdy kolumna varchar ma postać FK w tabeli o miliardach wierszy. Miałbyś wtedy klucz zastępczy dla PK i FK, ale nadal potrzebujesz unikalnego ograniczenia / indeksu dla naturalnego klucza varchar.

Twoje tabele są dość małe, a wydajność może być związana z klauzulą ​​OR. Niestety ten sam problem obowiązuje bez względu na strukturę zapytania (i nie znam wystarczająco dużo PostgresSQL, aby zaoferować dużo przepraszam)

gbn
źródło
0

Spróbuj pozbyć się części zapytania „OR e2.email IS NULL” i sprawdź, jak szybko działa. Jeśli działa szybciej, być może będziesz w stanie uruchomić go szybciej dzięki „union all”

Joe Love
źródło