У меня есть таблица базы данных с китайскими словарями (около 300 000 строк) для онлайн-словаря. Структура данных выглядит следующим образом:
ID ch_smpl pinyin definition
----------------------------------------
1 我 wǒ I, me
2 我们 wǒmen we, us
etc.
Я плохо разбираюсь в php и mysql, поэтому вопрос заключается в том, как настроить поисковую систему? Я нашел кучу учебников по php mysql search, я также нашел несколько полнотекстовых поисковых примеров, но я не уверен, как это работает с китайскими персонажами. Скорость поиска действительно важна для меня.
Приветствуются любые предложения о том, как организовать поисковую систему для этой цели.
Скорость вашей "поисковой системы" зависит в основном от трех вещей:
Таким образом, не будет "перевернуть этот переключатель, и вы получите супер-пупер". Вам нужно будет заняться всеми этими областями. В дополнение к этому есть много других вещей, которые могут повлиять на производительность. Например: операционная система, жесткий диск, объем памяти и т.д.
Давайте начнем с конфигурации 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 '我%'
Один последний совет. Нет специального переключателя, который вы можете перевернуть, как я уже говорил. Есть много вещей, которые вы можете сделать для достижения лучшей производительности. Попробуйте несколько вещей и оцените производительность.