Mysql многострочный индекс - PullRequest
0 голосов
/ 26 января 2011

У меня следующий запрос в mysql.

SELECT
    *
FROM
    Accounts AS a
WHERE
    ('s' IS NULL OR (a.FirstName LIKE CONCAT('s','%') OR
                      a.LastName LIKE CONCAT('s','%') OR
                      a.FullName LIKE CONCAT('s','%')
                     )
    )

Как поставить индексы для таблицы?

p.s. 's' на самом деле является переменной в хранимой процедуре, поэтому s 'IS NULL и concat необходимы.

Ответы [ 3 ]

1 голос
/ 26 января 2011

Прежде всего, просто быстрое предложение: не используйте concat , если вам не нужно.Ваш запрос можно переписать, так как ('s' is NULL) всегда ЛОЖЬ, поэтому вы всегда можете получить все строки, основываясь на втором условии:will:

create index idx_01 on accounts(FirstName);
create index idx_01 on accounts(LastName);
create index idx_01 on accounts(FullName);

Вы также можете рассмотреть индекс ПОЛНОГО ТЕКСТА ПОИСКА для вашей таблицы.

1 голос
/ 26 января 2011
  1. 's' IS NULL всегда ложно

  2. Есть ли причина, по которой вы используете CONCAT('s','%') вместо 's%'?

  3. Попробуйте составной индекс на (FirstName, LastName, FullName), хотя он может работать не очень хорошо для (VAR)CHAR с (или даже вообще кажется)


Поскольку # 3 не работал, я могу только отослать вас к руководству по MySQL. Здесь немного об использовании того, как MySQL использует индексы с LIKE здесь

0 голосов
/ 26 января 2011

для вас full text indexing также вариант

добавить полнотекстовый индекс для 3 полей, затем

использование

MATCH() AGAINST() синтаксис

Например

 SELECT * FROM articles WHERE MATCH (title,body)
 AGAINST ('superb catch' IN BOOLEAN MODE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...