mysql LIKE query takes too long

10,314

Solution 1

I removed this query so it wont show the total result count when a search is done.

Seems a temporary solution or even permanent.

Solution 2

The % at the beginning of the string to match makes it so that the indexes cannot be used. A wildcard at the beginning nullifies the index and MySQL has to search within that column in every row. It can't skip down. If you know that the item you are searching for will be at the beginning of the beginning of the field, you can remove the beginning '%'.

However, if you are searching for 'steve', my answer will return 'steve', 'steven', 'steve-boss', but not 'boss-steve' or 'realsteve'.

Solution 3

The initial % in your LIKE clauses means that the indexes for these columns cannot be used. I believe that the MySQL full text index may do what you want.

Solution 4

It uses indexes as much as it can (both primary keys for your left join). The main problem is LIKE '%a%', because in that case it cannot use index (if it was 'a%', it would be able to use index on username and name). What you can try (not sure if that will speed up things) is to use concat(usr.username, prof.name) like '%a%', but you will probably not notice any difference.

Full text index will not work, because full text index is useful when you search for a whole word.

Anyway, for the query you have your indexes on name and username are useless and just taking up space, so I would delete them. If LIKE 'a%' satisfies your need, then those indexes make sense.

If 'a%' doesn't satisfy your needs, you might take a look at other options, for example mysql query cache (if you expect frequent repetition of queries).

Solution 5

1) Buy a faster database server.

2) Redesign your database so that you don't have to look in two places for username or only allow users to search on one or the other

Share:
10,314
stergosz
Author by

stergosz

Joomla & WordPress developer based in Greece Developing Joomla extensions on tassos.gr Developing WordPress plugins on fireplugins.com

Updated on July 20, 2022

Comments

  • stergosz
    stergosz almost 2 years

    SQL :

            SELECT
                COUNT(usr.id) as `total_results`
            FROM
                users as usr
                LEFT JOIN profile as prof
                    ON prof.uid = usr.uid
            WHERE
                usr.username LIKE '%a%'
                OR
                prof.name LIKE '%a%' 
    

    Indexes on users:

    uid - uid
    username - username
    

    Indexes on profile

    index1 - uid
    index2 - uid,name
    index3 - name
    

    EXPLAIN :

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   PRIMARY     usr     ALL     NULL    NULL    NULL    NULL    18387   
    1   PRIMARY     prof    ref     index2,index1   index2  8   site.usr.uid    1   Using where
    2   DEPENDENT SUBQUERY  sub     ref     i3,index1,index2    i3  16  site.usr.uid,const  1   Using index
    

    the above query takes about 0.1221

    how can i make it run faster?