2009-11-21 2 views
1

В одном из моих таблиц MySQL, я следующие столбцы:Улучшение поиска производительности

Skills  varchar(80) 
Industry varchar(40) 
Address  varchar(100) 

Навыки могут включать текст, как: C/C++, MS Office, Linux т.д. промышленность может включают текст, такой как: Финансы, IT и т. д. Адрес содержит полный почтовый адрес и название города. Нет отдельной колонки города.

На моей веб-странице У меня есть поля поиска, в которых пользователь может вводить ключевые слова для каждого столбца. Я использую SQL-запрос, как указано ниже:

Select studentname where skills like '%...%'; 

Я хочу улучшить результаты поиска, а также производительность. Например, пользователь мог ввести такой навык, как Linex вместо Linux. Итак, мой поиск должен вернуть ок. совпадение.

Пожалуйста, дайте мне знать, как я могу сделать поиск более точным и увеличить производительность. В настоящее время я определил индекс на skills, address и industry столбцов. Но производительность не очень хорошо.

Настольный двигатель InnoDB.

редактировать

Проблема заключается в том, что мы получаем предварительно заполненные листы MS Excel из различных учреждений. Приложение .NET читает значения столбцов листа Excel и сохраняет их в удаленной базе данных. Для разбиения таблиц нам нужно изменить наше приложение.

ответ

9

Предложение SQL

like '%...%' 

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

Что вы действительно должны делать, так это то, что вещи, такие как навыки, отрасли и т. Д., Разбиваются на другие таблицы с фиксированными значениями (например, «C», «C++», «SQL» и т. Д.).

Тогда у вас есть таблица «много-ко-многим» между человеком и навыками. Например:

People: 
    PersonId primary key. 
    Other person details. 
Skills: 
    SkillId primary key. 
    SkillName. 
    Other skill details. 
PeopleSkills: 
    PersonId references People(PersonId). 
    SkillId references Skills(SkillId). 
    primary key (PersonId,SkillId). 
    index on (SkillId). 

Такое расположение будет как улучшить скорость ваших запросов массово и сделать неправильный ввод данных невозможно, если вы только разрешить ввод поисковых терминов из таблицы Skills (нет «Линекс» можно где вы имели в виду «Linux», просто потому, что «Linex» не находится в таблице навыков).

Единственное неприступное правило, которое я следую за табличным дизайном, заключается в следующем: если вы пытаетесь извлечь немного информации из столбца, эту информацию следует поместить в свою колонку .Число проблем с производительностью, которые люди страдают, поскольку они создали таблицы с одним столбцом, содержащим значения, разделенные запятыми (где они хотят извлечь отдельные значения из этого столбца), должны быть свидетельством этого.

Недостатком необходимости обеспечения всех навыков и отраслей промышленности в отдельной таблице будет больше, чем восполнение повышенной скорости и точности. Базы данных должны быть всегда предназначены для третьей нормальной формы. Они могут быть регрессированы до 2NF по соображениям производительности, если вы понимаете последствия (и уменьшаете вероятность ошибочных данных с помощью триггеров или вычисленных столбцов), но это редко необходимо.

4

Я бы порекомендовал вам использовать полнотекстовый поиск с индексом. InnoDB не поддерживает полнотекстовой, но вы можете использовать внешние двигатели, как Apache Lucene, Zend_Search_Lucene (PHP), и т.д.

0

Отдельные навыки в таблице только для этого, а затем использовать Id для подключения к текущей таблице, некоторые, как это:

Skills: Id, Name 
Skills_YourTable: Skills_Id, YouTable_Id 
YouTable: Id, another fields. 

EX:

Select y.fields 
from YourTable as y 
    join Skills_YourTable as sy 
    join Skills as s 
where s.Name = 'MS Office' 
0

Как и другие плакаты упомянутый нормализовать вашу базу данных в первую очередь.

Чтобы справиться с орфографическими ошибками при поиске, посмотрите на SOUNDS LIKE

1

Другим решением является использование другой технологии поиска. Посмотрите на Zend Search Lucene framework. Это основано на JAVA-версии Lucene.

Он имеет гораздо лучший способ поиска контента. Вы можете искать отдельные слова, фразы, диапазоны, нечеткие, близость, усиление, подсветку и т. Д.

Однако ваш контент для поиска нужно хранить как плоские файлы, так и в базе данных, и вам нужно будет синхронизировать контент , Однако это говорит о том, что сила поиска стоит того. И это быстро, очень быстро.

Google: php lucene zend для получения дополнительной информации.

Also see this for a great tutorial

Смежные вопросы