我使用的是 MariaDB 10.1 和默认的 InnoDB 存储,我有几个表,目前有 10 到 1 亿行。这些表将保持每月数百万的增长,而且主要是缓存。
它们要么有一个单列主键 ( BIGINT
) 或一个复合主键(两BIGINT
列),没有 AUTO_INCREMENT,我总是按主键插入、选择或更新。我还通过主键或 selects 进行了很多连接WHERE PK IN (1, 2, 3, 4...)
。
此外,这些表每小时会收到大量更新,我通常一次以 5000 或 10000 个批次更新它们。对于其中一些表,我们有比选择更多的插入和更新。
我有3个问题:
在我看来,通过 PK 返回 1 行 ( SELECT x, y FROM table WHERE pk = 123
) 的简单选择在性能上与分区没有实际差异。那正确吗?
加入或选择为WHERE PK IN(SELECT PK FROM ...)
怎么样?与单个表相比,它会导致更多的扫描加入分区表吗?
考虑到我通常使用以下方法进行大量并发批处理(多个服务器可能同时发送数据):
INSERT INTO X VALUES (1, 'A'), (2, 'B'), ... ON DUPLICATE KEY UPDATE ...
或者
REPLACE INTO X VALUES(1, 'A'), …
假设我有一个带有 auto_increment 列的表,然后在单个语句中插入多个值:
insert into foo (bar) values ('a'), ('b'), ('c');
从文档中,last_insert_id()
返回查询的第一个生成的 ID,a
在本例中为 ID 。
mysql 是否保证 ab
和c
将被分配顺序值?
换句话说,如果 last_insert_id() 返回 1 for a
,是否有任何保证 b = 2 和 c = 3?或者是否存在由于多个并发插入而导致的结果,例如“a = 1, b = 5, c = 9”?