MySQL进阶学习:深入了解 join 的3种算法

哎呀,说到MySQL JOIN连接算法,就得从三种算法说起。
综上所述,MySQL 可以通过三种不同的方式建立两个表之间的关系。

第一个是SimpleNested-LoopJoin,这就像最原始的检查数据的方式。
你有一张桌子,然后逐行找到另一张桌子,就像拿着一本书逐行阅读一样。
例如,如果驱动表有1 0条记录,被驱动表也有1 0条记录,那么被驱动表将被检查1 00次,这是非常低效的。
这就像在大书店里找书一样。
必须一一翻书架,很累。

第二个是IndexNested-LoopJoin,就像使用目录一样。
一旦有了目录,直接翻到该页会更有效。
但是,这要求驱动表中的相关字段有索引,就像书里有目录一样,这样就可以直接找到那些页码。

最后一个是BlockNested-LoopJoin,就像拿着一张地图。
你把你要找的页码都写在书架上,然后一次性全部查起来,这比简单的方法更有效率。
MySQL有一个join_buffer_size,默认为2 5 6 k。
您可以根据实际情况进行调整,就像地图的大小一样。
您可以放大或缩小以查看您需要阅读的书的厚度。

总的来说,SimpleNested-LoopJoin是效率最低的,所以尽量不要使用它。
IndexNested-LoopJoin 效率很高,但需要索引。
BlockNested-LoopJoin是SimpleNested-LoopJoin的改进版本,适用于没有索引或者索引效果不好的情况。
我的建议是尝试给相关字段添加索引,使用IndexNested-LoopJoin,然后根据情况调整join_buffer_size。
JOIN 中不要使用太多字段,否则内存会满。

提高MySQL数据库查询效率有哪些技巧?

啊,这是数据库优化的一个大问题。
我们需要谈谈索引。
您是否知道索引就像图书馆目录一样,可以帮助您快速找到所需的书籍?如今大多数数据库都使用 IBM 首次提出的 ISAM 索引结构。

首先,您需要知道哪些列最适合建立索引。
例如,在联接中频繁使用的列、在排序或分组中频繁使用的列。
例如,如果您有一个员工表,则性别列有两个值:男性和女性。
你为此使用索引吗?说实话,你并不真正需要它,因为它会影响更新速度。

那么复合索引也很有用。
例如,如果您想要对多个列进行排序,请在这些列上创建复合索引。
另外,有些数据库有专门的工具来检查索引,比如Informix的tbcheck工具,可以检查索引是否有问题。

接下来我们来谈谈排序。
避免重复对大表进行排序,因为这会降低效率。
优化器通常使用索引来自动排序,因此您需要确保索引构建正确。

还要避免顺序访问大表。
就像在图书馆里按顺序翻阅书籍一样,效率很低。
您可以通过对连接列建立索引来避免这种情况。

然后避免使用相关子查询。
这就像在图书馆找书一样。
这就像在搜索时返回并阅读以前的书一样。
实在是效率太低了。

此外,避免使用复杂的正则表达式,例如 LIKE 和 MATCHES。
这种方法可以实现通配符匹配,但是效率太低。

最后,我们使用临时表和排序来加速查询。
这就像使用书签来标记图书馆中的位置一样,让您可以快速找到以前读过的内容。

总之,数据库优化是一门艺术,必须根据实际情况进行调整。
当时我不太理解,但后来慢慢就习惯了。