/ / Zapytanie Sphinx zajmuje zbyt wiele czasu - sfinks

Zapytanie Sfinksa zajmuje zbyt wiele czasu - sfinks

Robię indeks na stole z ~ 90 000 000 wierszy. Wyszukiwanie pełnotekstowe musi być wykonane w polu varchar, zwanym email. Ja także ustawiłem parent_id jako atrybut.

Kiedy wykonuję zapytania, aby wyszukać wiadomości e-mail pasujące do słów o małej liczbie trafień, są one natychmiast zwalniane:

mysql> SELECT count(*) FROM users WHERE MATCH("diedsmiling");
+----------+
| count(*) |
+----------+
|       26 |
+----------+
1 row in set (0.00 sec)

mysql> show meta;
+---------------+-------------+
| Variable_name | Value       |
+---------------+-------------+
| total         | 1           |
| total_found   | 1           |
| time          | 0.000       |
| keyword[0]    | diedsmiling |
| docs[0]       | 26          |
| hits[0]       | 26          |
+---------------+-------------+
6 rows in set (0.00 sec)

Sprawy komplikują się, gdy szukam wiadomości e-mail pasujących do słów o dużej liczbie trafień:

mysql> SELECT count(*) FROM users WHERE MATCH("mail");
+----------+
| count(*) |
+----------+
| 33237994 |
+----------+
1 row in set (9.21 sec)

mysql> show meta;
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| total         | 1        |
| total_found   | 1        |
| time          | 9.210    |
| keyword[0]    | mail     |
| docs[0]       | 33237994 |
| hits[0]       | 33253762 |
+---------------+----------+
6 rows in set (0.00 sec)

Za pomocą parent_id atrybut, czy nie daje żadnego zysku:

mysql> SELECT count(*) FROM users WHERE MATCH("mail") AND parent_id = 62003;
+----------+
| count(*) |
+----------+
|    21404 |
+----------+
1 row in set (8.66 sec)

mysql> show meta;
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| total         | 1        |
| total_found   | 1        |
| time          | 8.666    |
| keyword[0]    | mail     |
| docs[0]       | 33237994 |
| hits[0]       | 33253762 |

Oto moje konfiguracje Sfinksa:

source src1
{
type            = mysql
sql_host        = HOST
sql_user        = USER
sql_pass        = PASS
sql_db          = DATABASE
sql_port        = 3306  # optional, default is 3306

sql_query       = 
SELECT id, parent_id, email 
FROM users

sql_attr_uint   = parent_id

}

index test1
{
source          = src1
path            = /var/lib/sphinx/test1

}

Zapytanie, które muszę uruchomić, wygląda tak:

SELECT * FROM users WHERE MATCH("mail") AND parent_id = 62003;

Muszę uzyskać wszystkie wiadomości e-mail pasujące do określonej pracy i mieć pewność parent_id.


Moje pytania to: Czy istnieje sposób na zoptymalizowanie sytuacjiopisane powyżej? Może istnieje bardziej wygodny tryb dopasowywania dla tego typu zapytań? Jeśli przeprowadzę migrację na serwer z dyskami SSD, czy wzrost wydajności będzie znaczący?

Odpowiedzi:

1 dla odpowiedzi № 1

Po prostu liczyć można po prostu zrobić

 Select id from index where match(...) limit 0 option ranker=none; show meta;

I pobierz z total_found.

Będzie o wiele bardziej wydajny niż liczba [*), która wywołuje grupę według.

Lub nawet call keywords("word","index",1); jeśli tylko pojedyncze słowa.