sql >> Database >  >> NoSQL >> MongoDB

het opzoeken van jokertekens versnellen

De PostgreSQL-queryplanner is slim, maar geen AI. Om het een index voor een uitdrukking te laten gebruiken gebruik de exact dezelfde uitdrukkingsvorm in de zoekopdracht.

Met een index als deze:

CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));

Of eenvoudiger in PostgreSQL 9.1:

CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));

Gebruik deze zoekopdracht:

SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';

Dat is 100% functioneel equivalent aan:

SELECT * FROM t WHERE lower(a) LIKE 'abcd%'

Of:

SELECT * FROM t WHERE a ILIKE 'abcd%'

Maar niet :

SELECT * FROM t WHERE a LIKE 'abcd%'

Dit is een functioneel andere zoekopdracht en je hebt een andere . nodig index:

CREATE INDEX t_a_idx ON t (substring(a, 1, 4));

Of eenvoudiger met PostgreSQL 9.1:

CREATE INDEX t_a_idx ON t (left(a, 4));

En gebruik deze vraag:

SELECT * FROM t WHERE left(a, 4) = 'abcd';

Links verankerde zoektermen van variabele lengte

Hoofdletter ongevoelig. Index:

Bewerken :Bijna vergeten:als u uw db uitvoert met een andere landinstelling dan de standaard 'C', moet u geef expliciet de operatorklasse op - text_pattern_ops in mijn voorbeeld:

CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);

Vraag:

SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';

Kan de index gebruiken en is bijna net zo snel als de variant met een vaste lengte.

Mogelijk bent u geïnteresseerd in deze post op dba.SE met meer details over patroonovereenkomst , vooral het laatste deel over de operators ~>=~ en ~<~ .



  1. Hoe kan ik een cursor.forEach() in MongoDB gebruiken met Node.js?

  2. Mongorestore van een db die me problemen bezorgt

  3. Sessie opslaan en ophalen uit Redis

  4. fout:typeparameter `D' moet worden gebruikt als de typeparameter voor een lokaal type