2013-07-09 34 views
5

Używam mysql bazy danych, która ma tylko jedną tabelę „dane” z 17,151257 rows.This tabela ma kolumnę ciąg. Chcę wydrukować wszystkie wiersze, w których kolumna ciąg zawiera określony ciąg znaków zapytania (przechowywanego w „entered_query” zmiennej), więc stosowane następujące:mysql optymalizacja kwerenda wybierająca i jak działa ograniczenie w mysql

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

Jako oczywiste powyżej zapytania zajmuje zbyt wiele czasu, aby wykonać .

Czytałem, że indeksowanie może być używane, ale jak w tym przypadku?
Myślałem również o dzieleniu całych danych na 10 różnych wierszy, a następnie wykonywaniu 10 równoległych zapytań przy użyciu
perl DBI.

Teraz mam następujące pytania:

  1. Jak zmniejszyć czas realizacji?
  2. Słyszałem, że "LIKE" w zapytaniu mysql unika indeksowania, więc czy jest jakaś lepsza alternatywa dla powyższego zapytania?
  3. Gdy używamy limitu 10 w zapytaniu mysql następnie robi mysql zatrzymuje wykonywanie tak szybko, jak to stwierdza pierwszych 10 wyników lub najpierw przeszukuje cały dane dla danego zapytania wówczas zwraca pierwszych 10 wyników
+0

Mam nadzieję, że '$ requested_query' nie zawiera tego, co sugeruje jego nazwa. W przeciwnym razie może to być sposób na przyspieszenie zapytań, których nie chcesz. – innaM

+0

Co to jest "DISTINCT *" i czy istnieje dolny limit rozmiaru wprowadzonego ciągu? – innaM

+0

@innaM DISTINCT * służy do wyboru tylko unikatowej krotki. $ wprowadzona_wartość zawiera zapytanie, które użytkownicy wprowadzili do wyszukiwania w kolumnie "ciąg" od tabeli "dane". * Przepraszamy za wybranie mylącego przykładu. –

Odpowiedz

7

Regularne indeksowanie może użyj tego, by poprawić to zapytanie. Indeksy MySQL to B-drzewa, co oznacza, że ​​bardzo szybko mogą znaleźć prefiks indeksowanej kolumny. Ale ponieważ twoje zapytanie LIKE ma na początku %, nie ma unikalnego prefiksu do wyszukania. Więc każdy rząd musi zostać zeskanowany, aby dopasować się do wzorca.

Jednak MySQL obsługuje również wyszukiwanie pełnotekstowe. Spowoduje to utworzenie indeksu wszystkich słów w kolumnie i może szybko znaleźć te słowa. Szczegółowe informacje można znaleźć w części documentation.

Jeśli użyjesz LIMIT 10, zatrzyma skanowanie, gdy tylko znajdzie pierwsze 10 wierszy spełniających warunki. Jeśli nie używasz także ORDER BY - wówczas musisz znaleźć wszystkie wiersze, aby móc je posortować przed wybraniem pierwszej 10.

+0

Dzięki .... Czy jest jakiś powód, dla którego można osiągnąć ten sam rezultat bez używania LIKE? a co powiesz na dzielenie całych danych na 10 różnych wierszy, a następnie wykonywanie 10 równoległych zapytań przy użyciu perl DBI. –

+0

Powiedziałem ci, jak to zrobić bez użycia LIKE, użyj wyszukiwania pełnotekstowego. Rozdzielenie go na osobne zapytania może pomóc, zależy to od liczby rdzeni na serwerze bazy danych. Ale wąskim gardłem jest prawdopodobnie dysk, więc to nie pomoże zbyt wiele. – Barmar