Obecnie mam następujące:Szybsze wyszukiwanie rekordów, w których 1. znak pola nie pasuje [A-Za-z]?
User (id, fname, lname, deleted_at, guest)
mogę zapytać o listę użytkownika poprzez ich fname
inicjału tak:
User Load (9.6ms) SELECT "users".* FROM "users" WHERE (users.deleted_at IS NULL) AND (lower(left(fname, 1)) = 's') ORDER BY fname ASC LIMIT 25 OFFSET 0
ta jest szybka dzięki następującym index:
CREATE INDEX users_multi_idx
ON users (lower(left(fname, 1)), fname)
WHERE deleted_at IS NULL;
Co chcę teraz zrobić, to móc zapytać o wszystkich użytkowników, którzy nie zaczynają od litery AZ. Mam to działało tak:
SELECT "users".* FROM "users" WHERE (users.deleted_at IS NULL) AND (lower(left(fname, 1)) ~ E'^[^a-zA-Z].*') ORDER BY fname ASC LIMIT 25 OFFSET 0
Ale problemem jest to zapytanie jest bardzo powolny i nie wydaje się być przy użyciu indeksu, aby przyspieszyć pierwsze zapytanie. Jakieś sugestie na temat tego, w jaki sposób mogę sprawić, że 2. zapytanie (nie a-z) jest szybsze?
Używam PostgreSQL 9.1 z szyn 3,2
Dzięki
Dziękujemy za przedstawienie wersji. Pomocne może być wklejenie opcji EXPLAIN ANALYZE w obu zapytaniach do http: //explain.depesz.com/i powiązane z nimi tutaj (powinieneś to zrobić dla wszystkich pytań dotyczących wydajności), chociaż w tym przypadku jest dość jasne, że pierwszy używa indeksu, którego drugi nie może. –
Proszę połączyć się z wcześniejszymi, pokrewnymi pytaniami, jeśli już istnieją, ułatwia to odpowiadanie. –