Поиск в базе данных MySQL [закрыт]

0

У меня есть таблица базы данных с китайскими словарями (около 300 000 строк) для онлайн-словаря. Структура данных выглядит следующим образом:

 ID     ch_smpl     pinyin     definition
 ----------------------------------------
 1       我           wǒ          I, me
 2       我们         wǒmen       we, us
 etc.

Я плохо разбираюсь в php и mysql, поэтому вопрос заключается в том, как настроить поисковую систему? Я нашел кучу учебников по php mysql search, я также нашел несколько полнотекстовых поисковых примеров, но я не уверен, как это работает с китайскими персонажами. Скорость поиска действительно важна для меня.

Приветствуются любые предложения о том, как организовать поисковую систему для этой цели.

Теги:
search
cjk

1 ответ

0
Лучший ответ

Скорость вашей "поисковой системы" зависит в основном от трех вещей:

  • Ваш SQL-запрос
  • Структура вашей базы данных
  • Конфигурация MySQL

Таким образом, не будет "перевернуть этот переключатель, и вы получите супер-пупер". Вам нужно будет заняться всеми этими областями. В дополнение к этому есть много других вещей, которые могут повлиять на производительность. Например: операционная система, жесткий диск, объем памяти и т.д.

Давайте начнем с конфигурации MySQL. Сначала вы должны попробовать функцию кеширования запросов mysql. Если вы в основном выполняете операции чтения, это может повысить вашу производительность, поскольку все происходит из кеша, и никаких операций ввода/вывода не требуется.

Читайте здесь: Документация MySQL по кэшу запросов

Еще одна важная область - ваш дизайн базы данных или какой механизм базы данных вы выбираете. В принципе у вас есть три варианта: InnoDB, MyIsam и Memory (есть другие, но я их действительно не знаю).

Насколько я знаю, MyIsam и Memory поддерживают только блокировку таблицы, а не блокировку строк. Но опять же, если вы в основном выполняете операции чтения, это не повлияет на вас. В общем, они оба быстрее, чем InnoDB. Если бы я был вами, я бы начал с Memory, потому что все в памяти. Но имейте в виду последствия: вам может потребоваться больше памяти, и вы потеряете несохраненные данные, если сервер сработает.

InnoDB, с другой стороны, дает вам много безопасности данных и может быть довольно быстрым, если вы настроите его правильно. К несчастью, это широкая область. Поэтому я не буду покрывать все это. Прежде всего, нужно установить innodb_buffer_pool_size примерно в 80% вашей памяти. Поэтому, если у вас 10 ГБ оперативной памяти, вы можете установить его на 8 ГБ.

Если ваш сервер имеет более 8 процессоров, вам также может потребоваться установить innodb_thread_concurrency на большее число. Вы должны использовать 2 * Количество процессоров.

Если вы хотите узнать больше о производительности MySQL, вы должны взять чашку кофе и прочитать этот блог: Блог производительности MySQL

Еще одна важная вещь - использовать индексы для некоторых ваших столбцов. Но я не могу сказать, будет ли он окупиться в вашем случае, поскольку мои знания о китайском словаре ограничены;)

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

Насколько мне известно, его также следует использовать только в том случае, если в столбце содержится много разных данных. Если у вас есть, например, столбец "пол", который содержит только "мужскую" или "женскую", вы, скорее всего, сломаете только дерево индексов пополам. Если у вас 100 пользователей, вы получите 50 строк. Но если вы будете использовать индекс для своего номера телефона, который в большинстве случаев уникален, вы получите только одну строку, которая намного эффективнее.

Так что, возможно, вы должны использовать индекс для столбца ch_smpl.

Последний, но не менее важный вопрос. Мой первый совет - выбрать как можно меньше данных. Это означает, что можно избежать таких запросов:

select * from ...

В вашем случае: если вы хотите только иметь определение для 我, вы должны использовать этот запрос:

select definition from dictionary where ch_smpl = '我'

а не

select * from dictionary where ch_smpl = '我'

Также избегайте "Like" -Statements с символом процента перед поисковым сервером, так как он дезактивирует индекс для этого столбца.

Например:

select * from dictionary where ch_smpl like '%我'

Вы должны использовать символ процента только после термина:

select * from dictionary where ch_smpl like '我%'

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню