Оптимизация запросов к словарю MySQL - PullRequest
0 голосов
/ 04 февраля 2019

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

$var = @$_GET['q'] ;
$varup1 = strtoupper($var);
$varup = addslashes ($varup1);

$query1 = "select distinct $lang from $dict WHERE
UPPER ($lang) LIKE trim('$varup')
or UPPER($lang) LIKE replace('$varup',' ','')
  or replace($lang,'ß','ss')  LIKE trim('$varup')
or replace($lang,'ss','ß')  LIKE trim('$varup')
or replace($lang,'ence','ance')  LIKE trim('$varup')
or replace($lang,'ance','ence')  LIKE trim('$varup')
or UPPER ($lang) like trim(trailing 'LY' from '$varup')
or UPPER ($lang) like trim(trailing 'Y' from '$varup')
or UPPER ($lang) like trim(trailing 'MENTE' from '$varup')
or UPPER ($lang) like trim(trailing 'EMENT' from '$varup')
or UPPER ($lang) like trim(trailing 'IN' from '$varup')

Цель состоит в том, чтобы строка поиска также находила разные записи одного и того же слова или наречие прилагательного.

Таблица выглядит как

table English German

или

table English Spanish

Например, «без нареканий» также должно отображать «безупречна».«Fuliz» также должен найти «full» и наоборот.

«Feliz» также должен найти записи для «Felizmente».

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

Весь код довольно длинный, и мне интересно, смогу ли я сделать его меньше без потери функциональности.Есть идеи?

1 Ответ

0 голосов
/ 05 февраля 2019

Где в запросе есть предложение FROM?

Можно связать вызовы REPLACE: REPLACE(REPLACE(..., 'a', 'b'), 'c', 'd'). Ditto for the TRIM`.

Как уже упоминалось, подходит COLLATION устраняет все потребности для UPPER() и LOWER().Избегайте сопоставлений ...general..., и вам будет предоставлено следующее: ss = ß.Многие, но не все, относятся к ij = ij и / или oe = œ и / или Aa = Å (и т. Д.);они тебе тоже нужны?Вот краткое изложение большинства ситуаций: http://mysql.rjweb.org/utf8_collations.html

Использование индекса FULLTEXT позаботится о большинстве окончаний, которые вы проверяете, и при этом исключается большая часть вашего кода.

Вы показываете несколько слов во втором столбце.Это просто для показа?Если вам нужно выделить слова, у вас есть другие неприятные проблемы.

Это само по себе ускорит запрос примерно в 10 раз:

WHERE english LIKE 'ha%'
  AND ... (whatever else you have)

То есть фильтрна первых 2 буквах с чем-то, что может использовать INDEX(english), в частности LIKE 'ha%' для слова hate.Поскольку вы, похоже, используете PHP, не должно возникнуть никаких проблем при встраивании этого в запрос.

Вот еще одна мысль о моем substring($word, 0, 2) ... Вместо того, чтобы специально использовать "2", посмотрите, будет ли floor(strlen($word)/2)работать достаточно хорошо.Таким образом, «безупречно» будет протестировано LIKE 'flawl%' и будет работать намного быстрее, чем даже в 10 раз.

Но другая проблема.Вы рубите и слово в таблице и слово, данное?Старайтесь не рубить слово в таблице.Чтобы обсудить это далее, пожалуйста, предоставьте записи в таблице для «недостатков», «недостатков», «безупречных», безупречных »и т. Д. Я не могу точно сказать, нужно ли вам пройти весь путь до« недостатков », но имеюразличные строки для различных форм.

Остерегайтесь некоторых очень коротких слов со странными формами.Возможно, вам нужно добавить дополнительные записи, чтобы SQL-запрос не был слишком запутанным.Они изменяют вторую букву: «ЛОЖЬ» и «ЛОЖЬ».Похоже, что есть даже общее слово, которое меняет первую букву.

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