I have a java application and I would like to get some data from a table and display in the application.
I have millions of records, and the query gets really slow when I am going to the last records. it takes few good minutes to get the results.
select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000
The above query returns a fast result. That is first pages returns fast. But when I am moving the last pages, it becomes slow.
select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000.
This query is slow and taking 17 secs.
Any ideas on how to make this faster? Id is the primary key of table1x.
The problem is in the like. To get the first 1000 records, the database only needs to filter the database until it finds 1000 records that match the search. For the other query, the database needs to match records until it has 645000 records, which makes it much slower. There is no sorting or other filtering, so the index on ID doesn’t help at all.
An index on
descriptionwould help, but not if you start the search with a wildcard, like you do now.I see two solutions.
First option is to add a FULLTEXT index on the description field. It allows to to look for the word
errorusing MATCH rather than LIKE. I think it will be a lot faster, but the index will become larger too, and I’m not sure about the optimizations on the long run.Second solution: Since you’re obviously looking for errors (I think you’re building a report on a log table?), you may add a column with a record type. You can give each record a type (just an integer) which indicates where that record holds an error or not. You will need to update your table once, and insert the type along with new records, but it will make your query faster.
I must admit that this second solution is based on assumptions about the data and your goal. If I’m wrong about that, please provide additional information and I may find a solution that suits you better.