答案 0 :(得分:1)
创建索引时,可以指定索引中仅应包含值的前缀。这是索引的大小。对于大多数数据类型而言,它是可选的,但对于mydata[-1, ] <- mydata[-1, ] * (mydata[-1, ] >= 3 * mydata[rep(1, nrow(mydata) - 1), ])
mydata
# [,1] [,2] [,3] [,4] [,5]
# threshold 1.95 1.76 3.67 0.57 2.33
# S1 6.00 0.00 0.00 3.00 0.00
# S2 0.00 0.00 0.00 8.00 16.00
# S3 0.00 14.00 0.00 12.00 0.00
和TEXT
列而言则是必需的。如果列的长度超过了索引大小的限制,则也需要该列;例如,对于某些表格式,InnoDB的索引大小限制为767个字节;如果要为BLOB
列建立索引,则需要指定小于768的前缀大小。
答案 1 :(得分:1)
这将对多少值进行唯一索引。您可以一对一地对整个值编制索引,也可以仅对可以将多个值放入一个存储区的前缀编制索引。这是性能/空间的权衡。
这是一个简化的示例。
如果要使用单个字符创建索引...
create table animals (
name varchar(255),
index(name(1))
);
那只会索引每个名字的第一个字符。
index name
----------------
A Ape
A Aardvark
A Ant
A Anteater
B Baboon
C Cat
D Dog
D Dingo
因此,当您查询where name = 'Aardvark'
时,它将使用A
索引来查找Ape, Aardvark, Ant, Anteater
的列表并进行搜索。索引可以提高查询的性能,但是仍然需要进行一些搜索。
假设您有index(name(3))
。
index name
----------------
Ape Ape
Aar Aardvark
Ant Ant
Ant Anteater
Bab Baboon
Cat Cat
Dog Dog
Din Dingo
现在,当您查询where name = 'Aardvark'
时,它将使用Aar
索引来查找Aardvark
,并且执行起来很快。但是,如果您搜索where name = 'Ant'
,它将使用Ant
查找Ant, Anteater
,并且必须搜索该列表。
您需要在索引大小和适合您的数据和查询的性能之间做出决定。
一个实际的例子,说我将SHA-1校验和存储为文本。那是40个字符长。但实际上,前7个或第8个字符非常有可能是唯一的。因此,我存储了所有40个字符,但只索引了前8个字符。
checksum char(40),
index(checksum(8))
现在where checksum = '97531bc4cb33c00f3e9ff10d65386b8e96cdae3d'
将使用97531bc4
索引,并且可能会产生单个值。这样可以节省大量空间,而不会影响性能。