复合主键在MySQL中的性能缺点

INSERT和UPDATE性能变化不大:对于(INT)和(INT,INT)键几乎相同。

复合PRIMARY KEY的SELECT性能取决于许多因素。

如果您的表是InnoDB,那么该表隐式地聚集在PRIMARY KEY值上。

这意味着如果两个值都包含键,那么对这两个值的搜索将更快;不需要额外的键查找。

假设你的查询是这样的:

SELECT  *
FROM    mytable
WHERE   col1 = @value1
        AND col2 = @value2

并且表布局是这样的:

CREATE TABLE mytable (
        col1 INT NOT NULL,
        col2 INT NOT NULL,
        data VARCHAR(200) NOT NULL,
        PRIMARY KEY pk_mytable (col1, col2)
) ENGINE=InnoDB

引擎将仅需要在表本身中查找确切的键值。

如果您使用自动增量字段作为假ID:

CREATE TABLE mytable (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        col1 INT NOT NULL,
        col2 INT NOT NULL,
        data VARCHAR(200) NOT NULL,
        UNIQUE KEY ix_mytable_col1_col2 (col1, col2)
) ENGINE=InnoDB

则引擎将需要首先查找索引ix_mytable_col1_col2中的值(col1,col2),从索引(id的值)检索行指针,并通过表中的id进行另一次查找。

但是,对于MyISAM表,这没有什么区别,因为MyISAM表是堆组织的,并且行指针只是文件偏移量。

在这两种情况下,将创建相同的索引(对于PRIMARY KEY或UNIQUE KEY),并且将以相同的方式使用。

参考链接

https://codeday.me/bug/20170916/72408.html

https://stackoverrun.com/cn/q/278457

https://oomake.com/question/278819%E2%80%8B

http://stackoverflow.com/questions/1460465/composite-primary-key-performance-drawback-in-mysql

results matching ""

    No results matching ""