Я работаю в базе данных MySql с такой таблицей:
+--------------+
| table_name |
+--------------+
| myField |
+--------------+
... и мне нужно сделать много запросов, как это (с 5-10 строк в списке) :
SELECT myField FROM table_name
WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...)
Там будет около 24.000.000 уникальных строк
1) Должен ли я использовать FULLTEXT
или или INDEX
ключ для моего VARCHAR(150)
?
2) Если я увеличу число символов со 150 до 220 или 250 ... будет ли это иметь большое значение? (Есть ли способ , чтобы вычислить его?)
3) Как я уже сказал, они собираются быть уникальным, так MyField должно быть PRIMARY KEY . Не редкость ли добавить ПЕРВИЧНЫЙ КЛЮЧ в поле, которое уже является ИНДЕКСОМ VARCHAR / FULLTEXT?
mysql
index
full-text-search
varchar
Башня Марка
источник
источник
Ответы:
ПРЕДЛОЖЕНИЕ № 1: Стандартная индексация
Если вы индексируете, как это, вы можете искать всю строку или выполнять лево-ориентированный поиск LIKE
ПРЕДЛОЖЕНИЕ № 2: Индексирование FULLTEXT
Вы можете эффективно использовать поиск по отдельным ключевым словам, а также целые фразы. Вам нужно будет определить пользовательский список стоп-слов, потому что MySQL не будет индексировать 543 слова .
Вот мои другие посты за последние два года по индексам FULLTEXT
May 23, 2011
: Оптимизация полнотекстового поиска в MySQL (StackOverflow)Oct 25, 2011
: Индекс FULLTEXT игнорируется в BOOLEAN MODE с условным числом словJan 26, 2012
: Mysql полнотекстовый поиск my.cnf оптимизацияMay 07, 2012
: MySQL EXPLAIN не показывает «использовать индекс» для FULLTEXTПРЕДЛОЖЕНИЕ № 3: Индексирование хэша
Если вы ищете одно конкретное значение, и эти значения могут иметь длину, значительно превышающую 32 символа, вы можете сохранить значение хеш-функции:
Таким образом, вы просто ищете хеш-значения для получения результатов
Попробуйте!
источник
like 'a%'
?MySQL позволяет вам определять индекс с префиксом, что означает, что вы определяете первые N символов из исходной строки для индексации, и хитрость заключается в том, чтобы выбрать число N, достаточно длинное, чтобы обеспечить хорошую избирательность, но достаточно короткое, чтобы сэкономить место. Префикс должен быть достаточно длинным, чтобы индекс был почти таким же полезным, как если бы вы проиндексировали весь столбец.
Прежде чем идти дальше, давайте определим некоторые важные термины. Селективность индекса - это отношение общего числа индексируемых значений к общему количеству строк . Вот один пример для тестовой таблицы:
Если мы будем индексировать только первый символ (N = 1), тогда таблица индекса будет выглядеть следующим образом:
В этом случае индекс селективности равен IS = 1/3 = 0,33.
Давайте теперь посмотрим, что произойдет, если мы увеличим количество проиндексированных символов до двух (N = 2).
В этом сценарии IS = 2/3 = 0,66, что означает, что мы увеличили селективность индекса, но мы также увеличили размер индекса. Хитрость заключается в том, чтобы найти минимальное число N, которое приведет к максимальной селективности индекса .
Есть два подхода, которые вы можете сделать вычисления для вашей таблицы базы данных. Я сделаю демонстрацию на этом дампе базы данных .
Допустим, мы хотим добавить столбец last_name из таблицы employee в индекс, и мы хотим определить наименьшее число N, которое обеспечит наилучшую селективность индекса.
Сначала давайте определим наиболее частые фамилии:
Как видите, фамилия Баба - самая частая. Теперь мы собираемся найти наиболее часто встречающиеся префиксы last_name , начиная с пятибуквенных префиксов.
Каждый префикс встречается гораздо чаще, что означает, что мы должны увеличивать число N, пока значения не станут почти такими же, как в предыдущем примере.
Вот результаты для N = 9
Вот результаты для N = 10.
Это очень хорошие результаты. Это означает, что мы можем сделать индекс по столбцу last_name с индексированием только первых 10 символов. В столбце определения таблицы last_name определяется как
VARCHAR(16)
, и это означает, что мы сохранили 6 байтов (или больше, если в фамилии есть символы UTF8) для каждой записи. В этой таблице 1637 различных значений, умноженных на 6 байтов, составляют около 9 КБ, и представьте, как это число будет расти, если наша таблица будет содержать миллион строк.Вы можете прочитать другие способы вычисления числа N в моем посте Префиксные индексы в MySQL .
Использование функций MD5 и SHA1 для генерации значений, которые должны быть проиндексированы, также не является хорошим подходом . Зачем? Прочтите это в посте Как правильно выбрать тип данных для первичного ключа в базе данных MySQL
источник
If you index like this, you can either look for the whole string or do left-oriented LIKE searches
. Я также сказал в ПРЕДЛОЖЕНИИ № 3If you are looking for one specific value and those values could be lengths well beyond 32 characters, you could store the hash value:
. Ваш ответ адекватно демонстрирует, почему не следует использовать огромные ключи и указывать на крайнем левом символе, что может повлиять на производительность. Ваш ответ принадлежит здесь. +1 за ваш ответ и добро пожаловать в DBA StackExchange.