【问题标题】:mysql sphinx generate unique idmysql sphinx 生成唯一ID
【发布时间】:2011-06-20 12:44:34
【问题描述】:

我将我的数据库分成 8 个部分,其中每个部分都包含带有表 user_data 的数据库,为了获得更好的搜索性能,我使用 sphinx 来索引所有这些数据,但我遇到了一个问题......因为表 user_data 没有任何唯一字段为了表示每一行,但它是一个一对多的表,我无法正确运行我的狮身人面像索引,因为它需要唯一的 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 在所有细分中必须是唯一的

【问题讨论】:

    标签: mysql search sphinx


    【解决方案1】:

    首先你应该在操作查询之前设置你的变量

    sql_query_pre = SET @a := 1;
    

    然后使用这个变量来获得虚构的自动增量

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

    【讨论】:

    • 应该是SET @a := 0 这样第一行实际上是1
    • 你能证明这适用于多个表,所以我理解正确。我正在查看下面的选项,我了解它是如何工作的,但我不喜欢这个。谢谢
    【解决方案2】:

    我不熟悉 Sphinx,但如果您希望创建跨表唯一的 id,在您的情况下:

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

    【讨论】:

    • 为什么一定要用整数?
    • Sphinx 需要一个整数
    【解决方案3】:

    你可以在索引时做这样的事情:

    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 的大小。

    【讨论】:

    • 这是可能的,但我找到了更好的解决方案
    【解决方案4】:

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

    WARNING: DOCID_MAX document_id, skipping
    

    您需要使用 –enable-id64 编译 sphinx 源代码,或者只需访问 sphinx 网站并获取最新的软件包(使用 –enable-id64 编译)。 this blog entry中给出了这种索引方法的更完整的示例

    【讨论】:

      【解决方案5】:

      我们将 crc32(uuid_short()) 用于 sphinx 的 32 位实现。这在大多数情况下都有效!办公室。不能依赖

      的 32 位摘要

      【讨论】:

        猜你喜欢
        • 2012-03-28
        • 2010-11-30
        • 2012-02-22
        • 1970-01-01
        • 2016-09-27
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多