MySQL Sphinx генерировать уникальный идентификатор - PullRequest
1 голос
/ 03 февраля 2011

Моя база данных разбита на 8 частей, где каждая часть содержит базу данных с таблицей user_data, для повышения производительности поиска я использую sphinx для индексации всех этих данных, но я сталкиваюсь с одной проблемой ... так как таблица user_data не имеет уникального полячтобы представить каждую строку, но это таблица 1 ко многим, у меня возникают проблемы с корректным запуском моего индекса сфинкса, поскольку он требует уникального идентификатора и, таким образом, разрешается в повторяющихся идентификаторах ... Любая идея, как я могу обойти это?или сгенерировать уникальный идентификатор по всем подиндексам из разных сегментов?

пример:

SELECT user_id, item_id, info
FROM user_data

, который возвращает что-то вроде:

+----------+-----------------------+
| user_id  | item_id    | info     |
+----------+-----------------------+
| 10       | 151        | asdf     |
| 10       | 152        | test     |
| 11       | 151        | 545      |
| 12       | 151        | sdfsd    |
| 12       | 152        | eewwe    |
| 12       | 153        | dfsd     |

, но мне нужно получить

+----------+-----------------------------+
| user_id  | item_id    | info     | id  |
+----------+-----------------------------+
| 10       | 151        | asdf     | 1   |
| 10       | 152        | test     | 2   |
| 11       | 151        | 545      | 3   |
| 12       | 151        | sdfsd    | 4   |
| 12       | 152        | eewwe    | 5   |
| 12       | 153        | dfsd     | 6   |

Конечно, идентификатор должен быть уникальным для всех сегментов

Ответы [ 5 ]

3 голосов
/ 07 февраля 2011

Прежде всего вы должны установить перед запросом действия, чтобы установить вашу переменную

sql_query_pre = SET @a := 1;

, а затем использовать эту переменную для получения вымышленного автоинкремента

sql_query = SELECT @a := @a + 1 AS id, user_id, item_id, info FROM user_data
1 голос
/ 03 февраля 2011

Я не знаком со Sphinx, но если вы хотите создать уникальные идентификаторы для таблиц, в вашем случае:

  1. Один из вариантов - использовать UUID в качестве уникального индекса для всех таблиц - вероятность их столкновения незначительна.
  2. Другой вариант, если вы знаете максимальный размер таблицы, использовать только числа в этом диапазоне плюс смещение.Например, идентификаторы таблицы 1: 1–10000, идентификаторы таблицы 2: 10001–20000 и т. Д. Вы можете даже установить поля id равными AUTO_INCREMENT и установить их начальные номера в начале определенного диапазона.
0 голосов
/ 04 июня 2013

Мы используем crc32 (uuid_short ()) для 32-битных реализаций sphinx.Это работает, большую часть времени!Ofc.нельзя полагаться на 32-битный дайджест

0 голосов
/ 13 июня 2012

Как предложено в другом ответе, говорящем использовать UUID.Но сфинкс не может использовать UUID в качестве идентификатора.Вам понадобится INT.Для этого используйте UUID_SHORT, и тогда у вас будет уникальное целое число (для mysql).Если это не работает «из коробки» (например, если вы используете Ubuntu-11.04), вы получите ошибку, подобную этой:

WARNING: DOCID_MAX document_id, skipping

Вам нужно будет скомпилировать источник sphinx с –enable-id64или просто зайдите на сайт sphinx и получите актуальный пакет (который скомпилирован с –enable-id64).Более полный пример этого метода индексации приведен в этой записи блога

0 голосов
/ 03 февраля 2011

Вы можете сделать что-то подобное при индексации:

SELECT user_id + 10 * 1 AS id, 1 AS segment_id, itme_id, info FROM user_data_1

... добавление segment_id. У вас их будет восемь, поэтому запрос на индексирование будет выглядеть примерно так:

SELECT (user_id + 10) * 1 AS id, 1 AS segment_id, itme_id, info FROM user_data_1
UNION
SELECT (user_id + 10) * 2 AS id, 2 AS segment_id, itme_id, info FROM user_data_2
UNION
SELECT (user_id + 10) * 3 AS id, 3 AS segment_id, itme_id, info FROM user_data_3
UNION
SELECT (user_id + 10) * 4 AS id, 4 AS segment_id, itme_id, info FROM user_data_4
UNION
SELECT (user_id + 10) * 5 AS id, 5 AS segment_id, itme_id, info FROM user_data_5
UNION
SELECT (user_id + 10) * 6 AS id, 6 AS segment_id, itme_id, info FROM user_data_6
UNION
SELECT (user_id + 10) * 7 AS id, 7 AS segment_id, itme_id, info FROM user_data_7
UNION
SELECT (user_id + 10) * 8 AS id, 8 AS segment_id, itme_id, info FROM user_data_8

Затем, когда вы запросите sphinx и получите обратно идентификаторы, просто отмените арифметику, разделив id на segment_id и вычтя 10. Таким образом, все идентификаторы будут уникальными в сфинксе. Просто убедитесь, что тип атрибута может соответствовать размеру идентификаторов, которые вы будете индексировать.

...