Problem z zapytaniami sql do dużej bazy.

0

Posiadam bazę danych zawierającą 37 mln rekordów w jednej tabeli (prosta tabelka jedynie z trzema kolumnami).
Kiedy zadaję zapytanie sql z wiersza poleceń (zapomniałem dodać że baza to mariadb) to zapytanie trwa okolo 1,5-2 minuty ale wynik jest zwracany poprawnie. Kiedy jednak to samo zapytanie wrzucam w kod php to nie otrzymuję wyniku. Ponieważ na wycinku tej samej bazy te same zapytania działają ok to podejrzewam jakieś timeout. Nie wiem tylko które gdzie i jak je przestawić.

Inna sprawa to czy macie jakieś metody aby przyspieszyć działanie takich zapytań do takiej bazy ? Zapytanie to proste select wybierające jedna kolumnę, na podstawie jednego where. Baza to jak już wspomniałem pojedyncza tabela z 37 mln rekordów (trzy kolumny) o rozmiarze niecałe 2GB.

Update
Co do optymalizacji zaindeksowałem juz kolumny po których przeszukuję bazę oraz typy danych stosuję char zamiast varchar. I po tej optymalizacji zeszłem z czasem zapytania do ~40 sekund. Nadal zbyt długo.

1

Próbowałeś dodać LIMIT na koniec zapytania aby ograniczyć ilość zwracanych rekordów?

0

Być może masz defaultowy timeout ustawiony na 30 sec. Spróbuj zwiększyć go bezpośrednio w skrypcie http://php.net/manual/en/function.set-time-limit.php albo bezpośrednio w php.ini (https://stackoverflow.com/questions/3829403/how-to-increase-the-execution-timeout-in-php).
Jak masz dojście do serwera (ustawień) możesz przejrzeć logi, aby dokładnie zobaczyć co powoduje problem

0

daj zapytanie i plan wykonania

co do limitu to spróbuj to https://stackoverflow.com/questions/3829403/how-to-increase-the-execution-timeout-in-php

1

Najpierw napisz nam jak wygląda zapytanie :)

0

Tabelka wygląda tak:
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| tekst| char(13) | YES | | NULL | |
| a| float | YES | MUL | NULL | |
| b| float | YES | MUL | NULL | |
+-------+----------+------+-----+---------+-------+

A zapytanie:

select tekst from ssid where a like "45.2213" and b like "16.5484";

Mam dostęp do wszystkiego na serwerze bo to mój serwer (z ustawieniami defaultowymi swierzo po instalacji apache,php, mariadb).

Za chwilę sprawdzę te timeouty zaproponowane przez hapertown.

1

A ile rekordów zwraca Ci to zapytanie?

0

Zajrzałem właśnie do logów apache i zwraca mi taki błąd podczas wykonania szukaj.php

[Tue Nov 28 0720.131973 2017] [:error] [pid 598] [client 192.168.239.1:58394] PHP Parse error: syntax error, unexpected 'tekst' (T_STRING) in /var/www/html/szukaj.php on line 22

linijka 22 wygląda następująco:
$sql = select tekst from tabelka where a like "45.2213" and b like "16.5484";

Kiedy wrzucam zapytanie
select tekst from tabelka where a like "45.2213" and b like "16.5484"; bezpośrednio z wiersza poleceń w terminalu w mariadb otrzymuję zwrot 8 rekordów.

0

KTO PORÓWNUJE LICZBY PRZEZ LIKE W DODATKU Z TEKSTEM????

select tekst from ssid where a = 45.2213 and b = 16.5484;

Dodatkowo jeśli a i b jest mocno zmienne to indeks niewiele pomoże ale można spróbować go założyć na polu a i b. Ma to być JEDEN indeks.

0

Zmieniłem zapytanie na takie jak zaproponowałeś. select tekst from ssid where a = 45.2213 and b = 16.5484; ale nic to nie pomogło. Dalej zwracany jest ten sam błąd. Dzięki za wskazówkę z indexem.

Kiedy wrzucam bezpośrednio do bazy

select tekst from tabelka where a = 45.2213 and b = 16.5484;

baza zwraca zero rekordów. Co jest dziwne biorąć pod uwagę że zapytanie z"like" zwracało ich 8.

0

select tekst, a from tabelka where a like "45.2212";
zwraca 17 rekordów ale
select tekst, a from tabelka where a = 45.2212;
już zero

0

Już wszystko działa.
Więc tak były dwa problemy:

  1. Nie wiem czemu nie mogę porównywać liczb przez =
    zamiast
    where a = 45.2213

musiałem napisać

where a > 45.2212 and a < 45.2214

  1. Miałem coś zwalone w instalacji php5-mysql

Przeinstalowałem to i wszystko ruszyło jak trzeba.

0

zwaloną masz bazę danych - definiowanie pól jako float właśnie tak się kończy. Trzeba było je zdefiniować jako numeric(8, 4) to nie miałbyś takiego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1