我们有一个包含1,000,000条记录的表。此表具有8个字符串列的键-
CREATE TABLE "Table" (
"pk1" varchar(20) DEFAULT NULL,
"pk2" varchar(20) DEFAULT NULL,
"pk3" varchar(20) DEFAULT NULL,
"pk4" varchar(20) DEFAULT NULL,
"pk5" varchar(20) DEFAULT NULL,
"pk6" varchar(20) DEFAULT NULL,
"pk7" varchar(20) DEFAULT NULL,
"pk8" varchar(20) DEFAULT NULL,
"combined_pk" varchar(200) DEFAULT NULL,
"more_data1" int(11) DEFAULT NULL,
"more_data2" int(11) DEFAULT NULL,
"more_data3" int(11) DEFAULT NULL,
"more_data4" int(11) DEFAULT NULL,
KEY "MainKey" ("pk1","pk2","pk3","pk4","pk5","pk6","pk7","pk8")
) ENGINE=InnoDB DEFAULT CHARSET=ascii
并不是所有的列都被填充,坦率地说,在大多数行中,只有3-4列是字段。
使用此键是为了防止表中相同键的重复。这不是唯一的/PK的原因是因为用户可以配置他可以接受复制。
该表80%为读取,20%为写入。
我知道复杂的复合索引可能效率低下。你认为创建一个新列更好吗?所有主键的列的串联(通过触发器提交),这个新列将被索引为varchar(200)?
或者干脆就这样放着不管?
谢谢!
发布于 2015-01-22 20:28:34
这篇评论太长了。
如果要在包含8列的索引和将相同数据放入单个列之间进行选择,那么就让索引保持原样!很难想象使用单列连接索引的查询会有多大用处。8列索引对于许多查询可能很有用。使用触发器和索引的更新/插入将比仅使用索引的更新/插入慢。
如果您试图确保这八个列没有重复项,则需要unique
而不是key
(允许重复的NULL
值,因此这不是问题)。
如果您希望这8列成为复合主键,那么我建议将它们声明为NOT NULL
,并发现将所有8列声明为主键。也就是说,我是自动递增整数主键的粉丝。如果您使用这样的主键,那么8列上的唯一索引就足够了。
https://stackoverflow.com/questions/28088683
复制相似问题