Как правильно искать числовые по Сфинксу? - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно сделать поиск по миллиарду записей в MySQL, и это очень долгий процесс (он работает сейчас). Может быть, Сфинкс поможет мне? Как правильно настроить Sphinx для поиска номеров? Должен ли я использовать целочисленный атрибут для поиска (не строковое поле)?

Мне нужно получить только строку, в которой отметка времени «ближайшая или равная» запросу:

CREATE TABLE test ( date TIMESTAMP(6) UNIQUE, num INT(32) );
| 2018-07-02 05:50:33.084011 |  282 |
| 2018-07-02 05:50:33.084028 |  475 |
...

(40 M таких строк ... все метки времени уникальны, поэтому этот столбец является уникальным индексом, поэтому мне не нужно создавать дополнительный индекс).

sphinx.conf:

source src1
{
type = mysql
...        
sql_query = SELECT * FROM test
}

индексатор ...

Sphinx 3.0.3
...
indexing index 'test'...
collected 40000000 docs, 0.0 MB

В моем тесте я нахожу ближайшую метку времени для запроса:

$start = microtime(true);
$query = '2018-07-02 05:50:33.084011';
$connMySQL = new PDO('mysql:host=localhost;dbname=test','','');
$sql = "SELECT * FROM test WHERE date <= '$search' ORDER BY date DESC LIMIT 1";
$que  = $connMySQL->query($sql);
$result = $que->fetchAll(PDO::FETCH_ASSOC);
$query  = $connMySQL->query('reset query cache');
$connMySQL = null;
print_r ($result);
echo 'Time MySQL:'.(microtime(true) - $start).' sec.';

$start = microtime(true);
$query = '2018-07-02 05:50:33.084029';
$connSphinxQL = new PDO('mysql:host=localhost;port=9306;dbname=test','root','');
$sql = "SELECT * FROM test WHERE date <= '$search' ORDER BY date DESC LIMIT 1";
$que  = $connSphinxQL->query($sql);
$result = $que->fetchAll(PDO::FETCH_ASSOC);
$query  = $connSphinxQL->query('reset query cache');
$connSphinxQL = null;
print_r ($result);
echo 'Time Sphinx:'.(microtime(true) - $start).' sec.';

Выход:

[date] => 2018-07-02 05:50:33.084011 [num] => 282 Time MySQL: 0.00193 sec.
[date] => 2018-07-02 05:50:33.084028 [num] => 475 Time Sphinx: 0.00184 sec.

Я предложил посмотреть несколько разных результатов, но заметил, что до индексации у меня тот же результат, поэтому я думаю, что Sphinx выполняет прямой поиск в MySQL по причине моей неправильной конфигурации. Только спросите здесь, я нашел: без текстового поиска

1 Ответ

0 голосов
/ 06 июля 2018

Должен ли я использовать целочисленный атрибут для поиска (не строковое поле)?

Да. Но дополнительным усложнением является то, что индексу НУЖНО хотя бы одно поле (sphinx действительно не предназначен для использования в качестве общей базы данных, он предназначен для текстовых запросов!)

Может синтезировать поддельный.

sql_query = SELECT unix_timestamp(`date`) AS id, 'a' AS field, num FROM test
sql_attr_uint = num

Также показывает, что нужно уникальное целое число, поскольку столбец first , чтобы быть document_id, кажется, что ваша временная метка уникальна, может использовать это. UNIX_TIMESTAMP - это удобный способ представить временную метку в виде простого целого числа.

Может также использовать id в запросах для фильтрации, поэтому необходимо будет одновременно конвертировать в метку времени.

$query = '2018-07-02 05:50:33.084011';
$id = strtotime($query)
$sql = "SELECT * FROM test WHERE id <= '$id' ORDER BY id DESC LIMIT 1";
...