我想了解一些关于mysql架构的事情。 1. sql进程如何在索引表中插入,删除,更新操作? 2.据说当索引页不在缓冲池中时,只在更改缓冲区中进行更改。因此,如果在缓冲池加载相关索引页面之后进行了更改,那么它也必须更改磁盘中的同一页面。对?那么必须在三个不同的地方进行操作? 3.如何将NULL值编入索引?它们将存储在b +树中的哪个位置? 4.如果我们更新作为聚集索引的数据,那么何时在磁盘中更新? 5.批量装载时会发生什么?
答案 0 :(得分:2)
如何处理插入/更新/删除...
PRIMARY KEY
,它与数据集群在一起。ROLLBACK
。更改缓冲区设计为对实际索引块“透明”。
(对不起,我对CB的了解对你所要求的水平有点模糊。我建议你阅读代码。)
NULL
...我相信它被视为一个单独的值,它在B + Tree中的所有非空值之前进行排序。但是为了混淆这个问题,有一个标志确定空值是否被视为彼此相等。 PRIMARY
/ UNIQUE
键有限制。
与NULL相关...在对PARTITION BY RANGE
或DATE
的某些变体/函数执行DATETIME
时,无效日期变为NULL
,该日期明确存储在UNIQUE
中'第一'分区。新手常常对为什么分区修剪似乎不起作用感到困惑。 (推荐的部分解决方法:使用'first'分区,否则为空。)
群集和 PRIMARY KEY
索引...所有(?)写入操作必须检查所有唯一索引,因此CB不参与此类操作。注意:在InnoDB中,NULLs
始终是群集且唯一的,不能(?)拥有INSERT
。
批量加载...我发现100行INSERTs
的运行速度是100个LOAD DATA
的10倍。 (这是由于解析等原因)但是在低级别,批量插入或INSERT ... ON DUPLICATE KEY UPDATE
只是一堆单独的插入。因此,上述讨论适用。
奖金回答......
“IODKU”(REPLACE
)几乎遵循上面的1..5步骤。在定位要更新的行时,它会发现是更新还是插入,然后相应地进行。
DELETE
实际上是UPDATE
的简写加上REPLACE
。但请注意此异常...如果表上有两个唯一键,则单行func pressedUserImage(_ sender: UITapGestureRecognizer) { ... }
可能会在插入1行之前删除2行。