Оптимизация поиска в MySQL

12
S
На сайте с 29.12.2008
Offline
43
1034

Оптимизация поиска в MySQL

Есть таблица sur_val, в ней два поля: surname (фамилия), value (значение фамилии).

Поле surname рассортировано по алфавиту, от меньшего к большему (от А до Я).

Поиск осуществляется так:

search_surname - фамилия, значение которой нужно найти

SELECT value FROM sur_val WHERE surname=search_surname

Вопрос: как бы оптимизировать SQL-запрос или структуру таблицы так, чтобы увеличить скорость поиска среди большого количества фамилий?

N
На сайте с 06.05.2007
Offline
419
#1
Кнопка вызова админа ()
S
На сайте с 29.12.2008
Offline
43
#2

Вдруг ещё что можно оптимизировать.

srarwars добавил 11.12.2009 в 22:26

так добавить поле id что ли? тип int ?

N
На сайте с 06.05.2007
Offline
419
#3

Точно недавно. int не надо добавлять. к индексам напрямую это не относится. многое зависит от задачи.

Узнав расшифровку незнакомого термина, стоит погуглить, чтобы узнать типичные методы применения и специфику применения в mysql.

S
На сайте с 29.12.2008
Offline
43
#4

Пример:

В базе две фамилии

Васильев

Дороженко

Надо найти значение фамилии Васильевский.

Такой фамилии в базе нет, но значение фамилии Васильев подходит для фамилии Васильевский.

Как тогда?

N
На сайте с 06.05.2007
Offline
419
#5

То есть все остальное вы уже дочитали? а там разве не написано, что индексы в mysql позволяют неплохо сокращать время поиска по известной левой части строки ? ну там где используется конструкция where name like 'васильев%'; ?

S
На сайте с 29.12.2008
Offline
43
#6
netwind:
То есть все остальное вы уже дочитали? а там разве не написано, что индексы в mysql позволяют неплохо сокращать время поиска по известной левой части строки ? ну там где используется конструкция where name like 'васильев%'; ?

Да, уже дочитал.

Но мне надо найти фамилию Васильевский, следовательно запрос будет

where name like 'Васильевский%' и не даст результата, т. к. такой фамилии нет

moonters
На сайте с 09.10.2008
Offline
139
#7
srarwars:
Да, уже дочитал.

Но мне надо найти фамилию Васильевский, следовательно запрос будет
where name like 'Васильевский%' и не даст результата, т. к. такой фамилии нет

where name like 'Васильевский%' и не даст результата, потому что там нет такой строки

where name like 'Васильев%' вернёт одну строку, потому что там есть "Васильев", в чём вопрос?

Мобильные прокси беру только тут - https://goo.su/G5nhch
N
На сайте с 06.05.2007
Offline
419
#8
srarwars:
Такой фамилии в базе нет, но значение фамилии Васильев подходит для фамилии Васильевский.

а давайте вы сначала осмыслите что mysql вам предоставляет, а потом подумаете как в его терминах изложить вашу задачу?

что значит "подходит" ? нет такого понятия в субд. Есть операции точного сравнения = и поиска по маске like.

Вот и думайте. Может быть, вас устроит при вставке данных хранить корень фамилии (василь) в отдельном поле и по нему уже искать. Выделить корень фамилии - это уже совсем другая история и не обязательно напрягать mysql. Наверное есть парсеры всякие.

S
На сайте с 29.12.2008
Offline
43
#9

Можно написать простенький грамматический анализатор с базой окончаний и т.п. Он будет возвращать корень слова, к примеру. А по корню уже можно будет искать, используя полнотекстовые запросы.

srarwars добавил 12.12.2009 в 01:20

netwind:

что значит "подходит" ? нет такого понятия в субд. Есть операции точного сравнения = и поиска по маске like

Я имел ввиду что значение для фамилия Васильев и Васильевский одно и тоже.

SI
На сайте с 19.12.2007
Offline
77
#10

>> Но мне надо найти фамилию Васильевский, следовательно запрос будет

>> where name like 'Васильевский%'

-- хм номер раз

>> хранить корень фамилии в отдельном поле и по нему уже искать

номер два. причем, в отдельной табле на выделенном сервере. сорри, не удержался.

рисуем, верстаем, кодим и крутим ...аа, да, еще принимаем заказы (:
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий