何时针对复合索引选择散列列

时间:2012-09-25 09:19:05

标签: mysql optimization indexing

我想知道在哪些情况下,使用复合索引时,首选带有索引的单个散列列。 在我的情况下,我有两个表约1 mio数据集,其中一个从另一个表接收更新值(它是一个数据导入例程)。 MySQL 5.1和5.5用于我的环境。

示例:

CREATE TABLE permanent (
ref_id_1 INT(10),
ref_id_2 INT(10),
ref_id_3 INT(10),
ref_id_4 INT(10),
ref_date DATE,
value INT(10));

CREATE TABLE import (
ref_id_1 INT(10),
ref_id_2 INT(10),
ref_id_3 INT(10),
ref_id_4 INT(10),
ref_date DATE,
value INT(10));

//Option 1
ALTER TABLE import ADD UNIQUE INDEX idx_composite(ref_id_1,ref_id_2,ref_id_3,ref_id_4,ref_date);
//Option 2
ALTER TABLE import ADD hash_col CHAR(32);
UPDATE import SET hash_col = MD5(CONCAT(ref_id_1,ref_id_2,ref_id_3,ref_id_4,ref_date)); 
ALTER TABLE import ADD UNIQUE INDEX idx_hash_col(hash_col);

当然,永久表也将有一个hash_col和所需的indizes。 现在两个可能的更新/连接将是:

//Join via columns 
UPDATE permanent
INNER JOIN import
ON import.ref_id_1 = permanent.ref_id_2
AND import.ref_id_2 = permanent.ref_id_2
AND import.ref_id_3 = permanent.ref_id_3
AND import.ref_id_4 = permanent.ref_id_4
AND import.ref_date = permanent.ref_date 
SET permanent.value = import.value;

//Join via Hash-col
UPDATE permanent
INNER JOIN import
ON import.hash_col = permanent.hash_col
SET permanent.value = import.value

那么哪种方法应该首选?是否有一个经验法则,如“如果你有超过X列,请使用哈希”。 提前谢谢!

P.S。这是我的第一个问题,所以请原谅是否缺少某些东西。

1 个答案:

答案 0 :(得分:1)

使用复合索引。比较十个整数比比较两个字符串要快。此外,从理论上讲,MD5哈希不能保证是唯一的(虽然这不应该是一个实际问题)。