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 № 1Po 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.