我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样)。 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加。
我的问题是:"复合主键"是否会降低此表上"插入和选择"的性能?
我应该使用简单的自动递增INT ID字段而不是Composite Primary Key吗? (我认为答案与MySQL处理多列索引的方式非常相关)
INSERT和UPDATE性能几乎没有变化:(INT)和(INT, INT)键几乎相同。
复合PRIMARY KEY的SELECT性能取决于许多因素。
如果您的表是InnoDB,则该表隐式聚集在PRIMARY KEY值上。
这意味着如果两个值都包含关键字,则搜索这两个值将更快:不需要额外的关键字查找。
假设您的查询是这样的:
SELECT *
FROM mytable
WHERE col1 = @value1
AND col2 = @value2
表格的布局是这样的:
,引擎将只需要在表本身中查找确切的键值。
如果您使用自动递增字段作为伪造ID:
,则引擎首先需要在索引ix_mytable_col1_col2中查找(col1, col2)的值,从索引中检索行指针(id的值),并在表中通过id进行另一次查找本身。
但是,对于MyISAM表,这没有什么区别,因为MyISAM表是堆组织的,并且行指针只是文件偏移量。
在这两种情况下,将创建相同的索引(