Ошибка MYSQL: # 3699 - Превышено время ожидания при совпадении с регулярным выражением - PullRequest
0 голосов
/ 02 июля 2019

Выполнение запроса MYSQL с помощью REGEX, и я получаю сообщение об ошибке тайм-аута.

У меня есть стек WordPress Bitnami NGINX в AWS с Ubuntu 16.

Использование MYSQL 8.0.16

Какие настройки в MYSQL (или где-либо еще) мне нужно изменить, чтобы остановить эту ошибку?

помощь оценена ..

попытался поиграть с файлом my.cnf и перезапустить MYSQL, но я не знаю, какое значение тайм-аута, кажется, есть несколько

это SQL-запрос

REPLACE INTO wp_term_relationships (term_taxonomy_id, object_id) SELECT '272',  ID
FROM  `wp_posts` 
   WHERE (
   post_title REGEXP 'German|Deutsch|Berlin|Hamburg|Munich|München|Cologne|Köln|Frankfurt|Stuttgart|Düsseldorf|Dortmund|Essen|Leipzig|Bremen|Dresden|Hanover|Hannover|Nuremberg|Nürnberg|Duisburg|Bochum|Wuppertal|Bielefeld|Bonn|Münster|Karlsruhe|Mannheim|Augsburg|Wiesbaden|Gelsenkirchen|Mönchengladbach|Braunschweig|Chemnitz|Kiel|Aachen|Halle|Saale|Magdeburg|Freiburg|Krefeld|Lübeck|Oberhausen|Erfurt|Mainz|Rostock|Kassel|Hagen|Hamm|Saarbrücken|Mülheim|Potsdam|Ludwigshafen|Oldenburg|Leverkusen|Osnabrück|Solingen|Heidelberg|Herne|Neuss|Darmstadt|Paderborn|Regensburg|Ingolstadt|Würzburg|Fürth|Wolfsburg|Offenbach|Ulm|Heilbronn|Pforzheim|Göttingen|Bottrop|Trier|Recklinghausen|Reutlingen|Bremerhaven|Koblenz|Bergisch Gladbach|Jena|Remscheid|Erlangen|Moers|Siegen|Hildesheim|Salzgitter|Baden-Württemberg|Bavaria|Bayern|Berlin|Brandenburg|Bremen|Hesse|Hessen|Lower Saxony|Niedersachsen|Mecklenburg-Vorpommern|North Rhine-|Westphalia|Nordrhein-Westfalen|Rhineland-Palatinate|Rheinland-Pfalz|Saarland|Saxony|Sachsen|Saxony-Anhalt|Sachsen-Anhalt|Schleswig-Holstein|Thuringia|Thüringen' 
   OR post_content REGEXP 'German|Deutsch|Berlin|Hamburg|Munich|München|Cologne|Köln|Frankfurt|Stuttgart|Düsseldorf|Dortmund|Essen|Leipzig|Bremen|Dresden|Hanover|Hannover|Nuremberg|Nürnberg|Duisburg|Bochum|Wuppertal|Bielefeld|Bonn|Münster|Karlsruhe|Mannheim|Augsburg|Wiesbaden|Gelsenkirchen|Mönchengladbach|Braunschweig|Chemnitz|Kiel|Aachen|Halle|Saale|Magdeburg|Freiburg|Krefeld|Lübeck|Oberhausen|Erfurt|Mainz|Rostock|Kassel|Hagen|Hamm|Saarbrücken|Mülheim|Potsdam|Ludwigshafen|Oldenburg|Leverkusen|Osnabrück|Solingen|Heidelberg|Herne|Neuss|Darmstadt|Paderborn|Regensburg|Ingolstadt|Würzburg|Fürth|Wolfsburg|Offenbach|Ulm|Heilbronn|Pforzheim|Göttingen|Bottrop|Trier|Recklinghausen|Reutlingen|Bremerhaven|Koblenz|Bergisch Gladbach|Jena|Remscheid|Erlangen|Moers|Siegen|Hildesheim|Salzgitter|Baden-Württemberg|Bavaria|Bayern|Berlin|Brandenburg|Bremen|Hesse|Hessen|Lower Saxony|Niedersachsen|Mecklenburg-Vorpommern|North Rhine-|Westphalia|Nordrhein-Westfalen|Rhineland-Palatinate|Rheinland-Pfalz|Saarland|Saxony|Sachsen|Saxony-Anhalt|Sachsen-Anhalt|Schleswig-Holstein|Thuringia|Thüringen'
   )
   AND post_type = 'post'

# 3699 - Превышено время ожидания при совпадении с регулярным выражением.

* обновление - не уверен, как добавить изображение в комментарии, поэтому добавлю сюда.

настройки переменных, ура @Rick James о том, как их перечислить

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 02 июля 2019

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

Попробуйте

A(?:achen|ugsburg)|B(?:a(?:den-Württemberg|varia|yern)|er(?:gisch[ ]Gladbach|lin)|ielefeld|o(?:chum|nn|ttrop)|r(?:a(?:ndenbur|unschwei)g|eme(?:rhave)?n))|C(?:hemnitz|ologne)|D(?:armstadt|eutsch|ortmund|resden|uisburg|üsseldorf)|E(?:r(?:furt|langen)|ssen)|F(?:r(?:ankfurt|eiburg)|ürth)|G(?:e(?:lsenkirche|rma)n|öttingen)|H(?:a(?:gen|lle|m(?:burg|m)|n(?:n)?over)|e(?:i(?:delberg|lbronn)|rne|ssen?)|ildesheim)|Ingolstadt|Jena|K(?:a(?:rlsruhe|ssel)|iel|oblenz|refeld|öln)|L(?:e(?:ipzig|verkusen)|ower[ ]Saxony|udwigshafen|übeck)|M(?:a(?:gdeburg|inz|nnheim)|ecklenburg-Vorpommern|oers|unich|önchengladbach|ü(?:lheim|n(?:chen|ster)))|N(?:euss|iedersachsen|or(?:drhein-Westfalen|th[ ]Rhine-)|uremberg|ürnberg)|O(?:berhausen|ffenbach|ldenburg|snabrück)|P(?:aderborn|forzheim|otsdam)|R(?:e(?:cklinghausen|gensburg|mscheid|utlingen)|h(?:einland-Pfalz|ineland-Palatinate)|ostock)|S(?:a(?:a(?:le|r(?:brücken|land))|chsen(?:-Anhalt)?|lzgitter|xony(?:-Anhalt)?)|chleswig-Holstein|iegen|olingen|tuttgart)|T(?:h(?:uringia|üringen)|rier)|Ulm|W(?:estphalia|iesbaden|olfsburg|uppertal|ürzburg)

Измените (?: на (, если ваш движок не поддерживает синтаксис без захвата.
Кроме того, вы можете изменить [ ] на пробел, если хотите на сжатый
регулярное выражение.

https://regex101.com/r/iEzw33/1

Расширен

    A
    (?: achen | ugsburg )
 |  B
    (?:
         a
         (?: den-Württemberg | varia | yern )
      |  er
         (?: gisch [ ] Gladbach | lin )
      |  ielefeld
      |  o
         (?: chum | nn | ttrop )
      |  r
         (?:
              a
              (?: ndenbur | unschwei )
              g
           |  eme
              (?: rhave )?
              n
         )
    )
 |  C
    (?: hemnitz | ologne )
 |  D
    (?:
         armstadt
      |  eutsch
      |  ortmund
      |  resden
      |  uisburg
      |  üsseldorf
    )
 |  E
    (?:
         r
         (?: furt | langen )
      |  ssen
    )
 |  F
    (?:
         r
         (?: ankfurt | eiburg )
      |  ürth
    )
 |  G
    (?:
         e
         (?: lsenkirche | rma )
         n
      |  öttingen
    )
 |  H
    (?:
         a
         (?:
              gen
           |  lle
           |  m
              (?: burg | m )
           |  n
              (?: n )?
              over
         )
      |  e
         (?:
              i
              (?: delberg | lbronn )
           |  rne
           |  ssen?
         )
      |  ildesheim
    )
 |  Ingolstadt
 |  Jena
 |  K
    (?:
         a
         (?: rlsruhe | ssel )
      |  iel
      |  oblenz
      |  refeld
      |  öln
    )
 |  L
    (?:
         e
         (?: ipzig | verkusen )
      |  ower [ ] Saxony
      |  udwigshafen
      |  übeck
    )
 |  M
    (?:
         a
         (?: gdeburg | inz | nnheim )
      |  ecklenburg-Vorpommern
      |  oers
      |  unich
      |  önchengladbach
      |  ü
         (?:
              lheim
           |  n
              (?: chen | ster )
         )
    )
 |  N
    (?:
         euss
      |  iedersachsen
      |  or
         (?: drhein-Westfalen | th [ ] Rhine- )
      |  uremberg
      |  ürnberg
    )
 |  O
    (?:
         berhausen
      |  ffenbach
      |  ldenburg
      |  snabrück 
    )
 |  P
    (?: aderborn | forzheim | otsdam )
 |  R
    (?:
         e
         (?:
              cklinghausen
           |  gensburg
           |  mscheid
           |  utlingen 
         )
      |  h
         (?: einland-Pfalz | ineland-Palatinate )
      |  ostock
    )
 |  S
    (?:
         a
         (?:
              a
              (?:
                   le
                |  r
                   (?: brücken | land )
              )
           |  chsen
              (?: -Anhalt )?
           |  lzgitter
           |  xony
              (?: -Anhalt )?
         )
      |  chleswig-Holstein
      |  iegen
      |  olingen
      |  tuttgart
    )
 |  T
    (?:
         h
         (?: uringia | üringen )
      |  rier
    )
 |  Ulm
 |  W
    (?:
         estphalia
      |  iesbaden
      |  olfsburg
      |  uppertal
      |  ürzburg
    )

Позволяет проверить скорость:

Regex1:   A(?:achen|ugsburg)|B(?:a(?:den-Württemberg|varia|yern)|er(?:gisch[ ]Gladbach|lin)|ielefeld|o(?:chum|nn|ttrop)|r(?:a(?:ndenbur|unschwei)g|eme(?:rhave)?n))|C(?:hemnitz|ologne)|D(?:armstadt|eutsch|ortmund|resden|uisburg|üsseldorf)|E(?:r(?:furt|langen)|ssen)|F(?:r(?:ankfurt|eiburg)|ürth)|G(?:e(?:lsenkirche|rma)n|öttingen)|H(?:a(?:gen|lle|m(?:burg|m)|n(?:n)?over)|e(?:i(?:delberg|lbronn)|rne|ssen?)|ildesheim)|Ingolstadt|Jena|K(?:a(?:rlsruhe|ssel)|iel|oblenz|refeld|öln)|L(?:e(?:ipzig|verkusen)|ower[ ]Saxony|udwigshafen|übeck)|M(?:a(?:gdeburg|inz|nnheim)|ecklenburg-Vorpommern|oers|unich|önchengladbach|ü(?:lheim|n(?:chen|ster)))|N(?:euss|iedersachsen|or(?:drhein-Westfalen|th[ ]Rhine-)|uremberg|ürnberg)|O(?:berhausen|ffenbach|ldenburg|snabrück)|P(?:aderborn|forzheim|otsdam)|R(?:e(?:cklinghausen|gensburg|mscheid|utlingen)|h(?:einland-Pfalz|ineland-Palatinate)|ostock)|S(?:a(?:a(?:le|r(?:brücken|land))|chsen(?:-Anhalt)?|lzgitter|xony(?:-Anhalt)?)|chleswig-Holstein|iegen|olingen|tuttgart)|T(?:h(?:uringia|üringen)|rier)|Ulm|W(?:estphalia|iesbaden|olfsburg|uppertal|ürzburg)
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   110
Elapsed Time:    5.74 s,   5736.58 ms,   5736578 µs
Matches per sec:   958,759

Ух ты, миллион слов в секунду!

0 голосов
/ 02 июля 2019

«Тайм-аут» предположительно из-за медленного запроса к большой таблице. Итак, давайте обратимся к скорости запроса.

  • REPLACE - это DELETE + INSERT.
  • REPLACE is slow due to the УДАЛИТЬ . And it will lose term_order`, если вы уже установили его.
  • Попробуйте вместо этого использовать INSERT IGNORE.
  • Предложение WHERE, из-за OR и REGEXP, должно будет сканировать всю таблицу. Индекс FULLTEXT может этого избежать; см. ниже.
  • Рефакторинг REGEXP мало поможет; изменение на LIKE скорее всего будет медленнее; и т.д.
  • Если тайм-аут действительно внутри механизма REGEXP, то вам может потребоваться выполнить запрос сразу для нескольких городов.

FULLTEXT значительно улучшит скорость. Но, если вы не хотите идти в этом направлении, следующим лучшим будет изменение REPLACE на INSERT IGNORE.

Подход FULLTEXT:

ALTER TABLE wp_posts ADD FULLTEXT(post_title, post_content);  -- one-time task

INSERT IGNORE INTO ... (...)
    SELECT 272, ID
        FROM wp_posts
        WHERE MATCH(post_title, post_content)
              AGAINST('German Deutsch Berlin Hamburg Munich München ...' IN BOOLEAN MODE)

(Может возникнуть проблема с обработкой ударений, в зависимости от версии MySQL и используемой ENGINE.)

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