2010-05-29 8 views
6

Mam kwerendę db, która spowoduje pełne skanowanie tabeli przy użyciu podobnej klauzuli i pojawił się pytanie byłem ciekawy o ...Czy posiadanie dłuższego ciągu w wyrażeniu podobnym do SQL pozwala na szybsze wykonywanie zapytań lub zapytań pomocniczych?

Które z poniższych powinny działać szybciej w Mysql, czy obaj uruchomią na ta sama prędkość? Benchmarking może odpowiedzieć w moim przypadku, ale chciałbym wiedzieć, dlaczego tak się stało. Filtrowana kolumna zawiera kilka tysięcy znaków, jeśli jest to ważne.

SELECT * FROM users WHERE data LIKE '%=12345%' 

lub

SELECT * FROM users WHERE data LIKE '%proileId=12345%' 

mogę wymyślić z powodów, dlaczego każda z nich może się wykonywać inne, ale jestem ciekaw, logikę.

Odpowiedz

3

Wszystkie rzeczy są równe, dłuższe łańcuchy powinny przebiegać szybciej, ponieważ pozwalają przeskakiwać ciągi testowe większymi krokami i mniej pasują do siebie.

Przykład algorytmów dopasowywania żądań patrz na przykład Boyer Moore Algorithm on Wikipedia.

Oczywiście nie wszystkie rzeczy są sobie równe, więc zdecydowanie testowałem to.

Szybkie sprawdzenie znaleźć w mysql reference docs dodaje się ustęp:

Jeśli używasz ... LIKE „% ciąg%” i łańcuch jest dłuższy niż trzy znaki, MySQL używa algorytmu Turbo Boyer-Moore zainicjować wzorzec ciągu, a następnie używa tego wzorca, aby szybciej wykonać wyszukiwanie.

+0

Dzięki za informację, ale testy porównawcze nie powiedziałyby mi, że używają tego konkretnego algorytmu. Chociaż prawdopodobnie używają czegoś podobnego. –

+0

Właśnie odwołuje się i stwierdził, że mysql używa Boyer-Moore i pod jakimi warunkami. Zaktualizowałem odpowiedź. –

+0

Fantastyczne. Dzięki. –

1

Nie ma różnicy. Ponieważ masz znak% na początku wyrażenia LIKE, to całkowicie wyklucza użycie indeksów, które mogą być użyte tylko do dopasowania przedrostka ciągu.

To będzie pełne skanowanie tabeli w obie strony.

W bazie danych o znacznej wielkości (tj. Takiej, która nie pasuje do RAM na serwerze 32G), IO jest największym kosztem z bardzo dużego marginesu, więc obawiam się, że algorytm dopasowywania wzorca nie będzie istotnych.

+0

prawda, ale nadal spala mniej cykli procesora, co dobrze wiedzieć w czasach Green IT ;-). –

+0

W takim przypadku zależy to od tego, które częściej występuje w polu, "p" lub "=". Musi porównać każdy znak w ciągu z pierwszą literalną postacią. Jeśli go nie znajdzie, może przestać. Jeśli masz dużo = ale niewiele 'p', to wyrażenie '% p' ​​jest lepsze i na odwrót. – MarkR

Powiązane problemy