Searching for a string at the end of a text column is typically slow, because no index is used. How to build a suitable index and make
LIKE '%end' fast.
The problem with LIKE
In the article Find texts starting, ending or containing a given string we discussed the
LIKE operator and its performance. We mentioned that a query like this cannot use an index:
SELECT title FROM film WHERE title LIKE '%odissey';
The reason is that an SQL query can use an index, or the leftmost part of an index. So it cannot use an index to search the end of a column, or in the middle of a column.
LIKE can only use an index to search for the beginning of a column.
The solution: indexes on expressions
Some DBMSs allow to create indexes on an SQL expression. They are called expressional indexes, or functional indexes.
Some other DBMSs allow to create a column that contains the result of an SQL expression, and an index on this column. The result is the same. This type of columns are called virtual columns, or generated fields.
Also, most DBMSs support the
reverse() function, that reverses the order of characters in a string. If we index an expression like
reverse(column) and we search the resulting index for
string, we’ll be able to search the end of a string while using an index.
The PostgreSQL syntax is the following, but we’ll not dig into the details:
CREATE INDEX ON film (reverse(title) text_pattern_ops); SELECT title FROM film WHERE reverse(title) LIKE reverse('odissey%');