mysql sphinx生成唯一的id

时间:2011-02-03 09:16:46

标签: mysql search sphinx

我的数据库分为8个部分,其中每个部分都包含带有user_data表的数据库,为了更好的搜索性能我使用sphinx索引所有这些数据,但我遇到了一个问题......因为表user_data没有任何唯一字段为了代表每一行,但它是一个1到多个表,我无法正确运行我的sphinx索引,因为它需要唯一的id,这种方式可以解决重复的ID ...任何想法如何解决这个问题?或者从不同的段中的所有子索引生成唯一的id?

示例:

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   |

当然,id必须是所有段的唯一

5 个答案:

答案 0 :(得分:3)

首先,您应该在操作查询之前设置设置变量

sql_query_pre = SET @a := 1;

然后使用此变量来获取虚构的自动增量

sql_query = SELECT @a := @a + 1 AS id, user_id, item_id, info FROM user_data

答案 1 :(得分:1)

我对Sphinx并不熟悉,但是如果你想在表格中创建独特的ID,那么在你的情况下:

  1. 一种选择是在所有表格上使用UUID作为唯一索引 - 它们碰撞的可能性很小。
  2. 另一个选择是,如果您知道表的最大大小,则仅使用该范围内的数字加上偏移量。例如,表1的ID:1 - 10000,表2的ID:10001 - 20000等。您甚至可以将id字段设置为AUTO_INCREMENT并在特定范围的开头设置其起始编号

答案 2 :(得分:0)

您可以在编制索引时执行以下操作:

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时,只需将id除以segment_id并减去10即可撤消算术。这样,所有的id都将在sphinx中独一无二。只需确保属性类型可以处理您要编制索引的ID的大小。

答案 3 :(得分:0)

正如在另一个回答中提到的那样使用UUID。但是狮身人面像不能使用UUID作为id。你需要一个INT。因此使用UUID_SHORT然后你有一个唯一的整数(对于mysql)。如果这不是开箱即用(例如,如果您使用Ubuntu-11.04),您将收到如下错误:

WARNING: DOCID_MAX document_id, skipping

您需要使用-enable-id64编译sphinx源代码,或者只需访问sphinx网站并获取最新的软件包(使用-enable-id64编译)。 this blog entry

中给出了这种索引方法的更完整示例

答案 4 :(得分:-2)

我们正在使用crc32(uuid_short())来实现sphinx的32位实现。大部分时间都可以使用! OFC。一个人不能依赖于

的32位摘要