mysql数据库的引擎设计为他提供了很强的扩展性,也为开源的大家,提供了各施拳脚机会。最有名气的莫过于innodb引擎了。这里暂且不说。
今天在看书《MySQL体系结构和存储引擎》的时候,介绍MySQL存储引擎NDB,有这么一段话。
NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此速度很慢。
这里有一点非常疑惑,就是为什么连接操作在MySQL的数据层完成,就会有巨大的网络开销呢?
猜测的答案:
因为NDB引擎的主要应用场景是一个集群存储引擎。而且是share nothing的。那么就会存在一个可能的情况。不同的表是分布在不同的NDB节点上的。那么如果需要连接操作,就需要不同的节点数据。
那么咋么解决这个问题呢。两种方案:
- 在某台机器上进行JOIN操作,而选择那台机器进行JOIN呢,根据什么标准进行选择呢。是随机选择某一台机器,让其进行连接。那么数据安全如何控制。而且如果选择的这台机器恰好已经被上一个JOIN操作选中,又该如何处理。或者是分析sql,选择与其他机器流量交互最少的那一台。那么必然存在不同分页的JOIN落到同一个节点。最后可能压垮这台机器。
- 在所有节点的上层节点,也即是MySQL层进行JOIN操作。上层权限是有的,但是数据肯定不在这台机器上。所有的操作需要告诉节点机,将数据拿过来,然后再进行操作。这里突然想到,因为是share nothing的,那么节点是独立的,这个join操作的过程中,可能其他节点的数据已经改变。就会出现幻读或者不可重复都的情况。有是一个CAP。
好了根据上面的分析,突然想到,为什么不对照下单机的JOIN呢,而在单机的数据库进行JOIN操作的时候,如果有索引还好,直接根据内存中的索引进行JOIN,但是如果没有索引。是需要将数据行加载到内存页进行JOIN操作的。那么单机的JOIN如此操作,集群的JOIN也就类似了。
集群JOIN,因为数据肯定不在当台机器的内存中,就需要与节点机,进行交互,将每个节点的数据拿过来,进行完JOIN操作。所以才会有巨大的网络开销一说。至此疑问解开。
以上均为自己理解,如有谬误,欢迎指正交流
网友评论