我正在创建一个包含大约6列的复合键的表。在某些查询中,我不会使用全部6列。如果我这样创建我的架构会有显着的性能下降吗?
create table my_table (
id int not null,
col_1 char(30),
col_2 char(30),
col_3 char(30),
col_4 int(11),
col_5 int(11),
col_6 char(30),
CONSTRAINT constraint_name PRIMARY KEY (col_1,col_2,col_3,col_4,col_5,col_6)
);
// Example query that doesn't use all the columns
select * from my_table where col_1="hello" and col_2="world";
答案 0 :(得分:1)
唯一重要的影响是索引会在磁盘和内存中占用更多空间。
使用密钥前缀中所有列的查询将能够利用索引。因此,使用col_1
和col_2
的查询将被完全索引(索引实现为B树或某些类似的结构)。但是使用col_1
和col_3
的查询只会使用索引来查找col_1
,但必须按顺序扫描所有这些行以测试col_3
。
答案 1 :(得分:0)
如果完整性需要主键,那么这就是您所需要的。如果您必须将6列的组合设置为唯一,那么这就是您拥有PRIMARY KEY的原因。
现在,这可能不是您正在执行的查询的最佳密钥,但是没关系:您可以创建更多密钥。在您未使用所有列"的示例中,您可以使用col_1和col_2作为密钥的组件创建不同的密钥。