2011-02-03 130 views
1

我有我的數據庫分爲8個部分,其中每個部分包含數據庫與表user_data,爲更好的搜索性能即時通訊使用sphinx索引所有這些數據,但即時通訊來處理一個問題...自表user_data沒有任何獨特的領域來表示每行,但它是1到很多表我有麻煩來正確運行我的獅身人面像索引,因爲它需要唯一的ID和這種方式解決重複ID ...任何想法我怎麼能解決這個問題?或者通過來自不同區段的所有子索引生成唯一的ID?mysql sphinx生成唯一的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的

必須是唯一的throght各階層

回答

3

首先你應該設置前,動作查詢來設置你的變量

sql_query_pre = SET @a := 1; 

然後使用這個變量獲得虛構的自動增量

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

你可以做omething像這樣同時索引:

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 

然後,當你查詢的獅身人面像和取回身份證,只是由segment_id劃分id減去10撤消算術。這樣,獅身人面像內的所有ID都將是唯一的。只要確保屬性類型可以處理您將要建立索引的id的大小。

+0

這是可能的,但我找到了更好的解決方案 – nabizan 2011-02-07 08:02:40

1

我不熟悉的獅身人面像,但如果你正在尋找創建是跨表唯一的,你的情況IDS:

  1. 一種選擇是使用UUID作爲唯一索引上的所有表 - 他們碰撞的機會很小。
  2. 另一種選擇是,如果您知道表格的最大尺寸,則只使用該範圍內的數字加上偏移量。例如,表1的ID:1 - 10000,表2的ID:10001 - 20000等。您甚至可以將id字段設置爲AUTO_INCREMENT,並在特定範圍的開始處設置其起始數字。
+0

uuid會罰款期望其字符串不是整數... – nabizan 2011-02-07 08:01:18

+0

爲什麼你必須使用一個整數? – ash 2011-02-07 09:29:45

0

作爲另一個答案說使用建議UUID。但是獅身人面像不能使用UUID作爲id。你將需要一個INT。因此使用UUID_SHORT,然後你有一個唯一的整數(對於MySQL)。如果這不會(如果你使用阿勒Ubuntu的11.04 EG)箱子的工作了,你會得到這樣的錯誤:

WARNING: DOCID_MAX document_id, skipping 

您需要編譯獅身人面像源用-enable-id64,或者只是去獅身人面像的網站,並獲得最新的軟件包(它是用-enable-id64編譯的)。這個索引方法的更完整的例子在this blog entry

-1

我們使用crc32(uuid_short())來實現sphinx的32位實現。這在大多數情況下都有效! OFC。一個不能依靠的32位消化的