Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most efficient way to search in SQL?

Tags:

sql

mysql

I have a database with 75,000+ rows with 500+ entries added per day.

Each row has a title and description.

I created an RSS feed which gives you the latest entries for a specific search term (ex. http://site.com/rss.rss?q=Pizza would output an RSS for the search term "Pizza").

I was wondering what would be the best way to write the SQL query for this. Right now I have:

SELECT * 
FROM 'table' 
WHERE (('title' LIKE %searcherm%) OR ('description' LIKE %searcherm%))
LIMIT 20;

But the problem is it takes between 2 to 10 seconds to execute the query.

Is there a better way to write the query, do I have to cache the results (and how would I do that?) or would changing something in the database structure speed up the query (indexes?)

like image 700
supercoolville Avatar asked Mar 06 '12 18:03

supercoolville


People also ask

Is elastic search faster than SQL?

Elasticsearch is a search engine that is based on the Lucene search engine. It is faster than SQL because it uses an inverted index. This means that it can index and search documents very quickly.

Which index supports faster searching is?

A SQL index is used to retrieve data from a database very fast.


1 Answers

A relatively simple solution for this would be incorporating a FULLTEXT index on these two fields and subsequently searching by using this index.

ALTER TABLE table ADD FULLTEXT(title, description);

Then would you need to perform a search, you'd do the following:

SELECT id FROM table
WHERE MATCH (title, description) AGAINST ('keyterm');

Fulltext indexed search is the automatic solution included in most SQL databases. It's much speedier comparing to doing LIKES. This is also optimized for your specific case because you are only interested in natural language search terms.

As well, fulltext index has some limiting algorithm for detecting relevancy. You can read more about it here

EDIT

In the alter statement, I missed the fulltext index name, it should be:

ALTER TABLE table ADD FULLTEXT ft_index_name(title, description);
like image 168
gtr32x Avatar answered Oct 22 '22 05:10

gtr32x