mysql как запрос занимает слишком много времени - PullRequest
0 голосов
/ 29 марта 2012

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%' 

Индексы по пользователям:

uid - uid
username - username

Индексы в профиле

index1 - uid
index2 - uid,name
index3 - name

ОБЪЯСНИТЬ:

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

указанный выше запрос занимает около 0,1221

как я могу заставить его работать быстрее?

Ответы [ 5 ]

8 голосов
/ 29 марта 2012

% в начале сопоставляемой строки делает невозможным использование индексов. Подстановочный знак в начале обнуляет индекс, и MySQL должен искать в этом столбце в каждой строке. Это не может пропустить. Если вы знаете , что искомый элемент будет находиться в начале начала поля, вы можете удалить начало «%».

Однако, если вы ищете «Стив», мой ответ вернет «Стив», «Стивен», «Стив-босс», но не «Босс-Стив» или «Реалстив».

3 голосов
/ 29 марта 2012

Начальные % в ваших предложениях LIKE означают, что индексы для этих столбцов не могут быть использованы.Я считаю, что Полнотекстовый индекс MySQL может делать то, что вы хотите.

1 голос
/ 29 марта 2012

1) Купить более быстрый сервер баз данных.

2) Перепроектируйте вашу базу данных, чтобы вам не приходилось искать имя пользователя в двух местах или разрешать пользователям выполнять поиск только по одному или другому

0 голосов
/ 30 марта 2012

Я удалил этот запрос, чтобы он не отображал общее количество результатов после завершения поиска.

Кажется временным решением или даже постоянным.

0 голосов
/ 29 марта 2012

Он использует индексы столько, сколько может (оба первичных ключа для вашего левого соединения).Основной проблемой является LIKE «% a%», потому что в этом случае он не может использовать индекс (если бы он был «%», он мог бы использовать индекс для имени пользователя и имени).То, что вы можете попробовать (не уверен, что это ускорит процесс), это использовать concat (usr.username, prof.name) как '% a%', но вы, вероятно, не заметите никакой разницы.

Fullтекстовый индекс не будет работать, потому что полнотекстовый индекс полезен при поиске целого слова.

В любом случае, для вашего запроса ваши индексы по имени и имени пользователя бесполезны и просто занимают место, поэтому я быудали их.Если LIKE '%' удовлетворяет вашу потребность, тогда эти индексы имеют смысл.

Если «%» не удовлетворяет вашим потребностям, вы можете взглянуть на другие варианты, например, кэш запросов MySQL (если вы ожидаете частое повторение запросов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...