实时索引:您可以将非数字 GUID 转换为数值(您可以使用转换为数字的 crc32 或 md5),如下所示:
mysql> select conv(mid(md5('abc'), 1, 16), 16, 10);
+--------------------------------------+
| conv(mid(md5('abc'), 1, 16), 16, 10) |
+--------------------------------------+
| 10376663631224000432 |
+--------------------------------------+
1 row in set (0.00 sec)
测试或谷歌找出哪种算法会减少冲突。
一旦您有了数字 ID,您就可以将您的文档插入到 Sphinx RT 索引中。
增量索引:您可以使用上述相同的方法将 GUID 转换为数字,但您必须记住索引的主要部分在哪里完成以构建增量。如果您的表中有一些“更新”或“插入”字段,则可以轻松完成。 sql_query_range 将类似于“select ... where updated > (select last_updated from sphinx_helper)”。在这种情况下,您不能基于 id,因为它们不是连续的。
我已经在 1180 万个不同的域上测试了一半的 md5 算法:
mysql> update domain_tmp set hash = conv(mid(md5(domain), 1, 16), 16, 10);
Query OK, 5901483 rows affected (1 min 59.03 sec)
Rows matched: 11800403 Changed: 5901483 Warnings: 0
mysql> select count(*) from domain_tmp;
+----------+
| count(*) |
+----------+
| 11800403 |
+----------+
1 row in set (16.30 sec)
mysql> select count(distinct hash) from domain_tmp;
+----------------------+
| count(distinct hash) |
+----------------------+
| 11800403 |
+----------------------+
1 row in set (1 min 5.51 sec)
即没有发生碰撞。因此,如果您的数据集中没有更多文档,则使用 md5 的一半应该没问题。