我在这里很困惑。
我有 2 个表,我将第一个(大约 50 万条记录)与第二个(大约 220 万条记录)连接起来,以便找出哪些记录在第一个而不是第二个。(典型的“b.attribute is null”废话)
为什么(如何)在第一个表上使用索引?无论如何,它必须遍历第一个表中的每条记录,但是当我尝试在第一个表上没有任何索引(或主键..不需要,因为这只是 ETL)的情况下进行此连接时,它会爬行。
顺便说一句,使用innodb。
帮助?
编辑:第二张表被索引。第一个不是。
我在这里很困惑。
我有 2 个表,我将第一个(大约 50 万条记录)与第二个(大约 220 万条记录)连接起来,以便找出哪些记录在第一个而不是第二个。(典型的“b.attribute is null”废话)
为什么(如何)在第一个表上使用索引?无论如何,它必须遍历第一个表中的每条记录,但是当我尝试在第一个表上没有任何索引(或主键..不需要,因为这只是 ETL)的情况下进行此连接时,它会爬行。
顺便说一句,使用innodb。
帮助?
编辑:第二张表被索引。第一个不是。
这应该对此有所了解:http ://dev.mysql.com/doc/refman/5.5/en/innodb-index-types.html
简而言之:所有 InnoDB 表都有所谓的“聚集索引”(即使没有在表上定义显式索引,InnoDB 也会自动创建它),其中存储了实际行。
我不知道这是否正在发生,但理论上,数据库引擎可能(取决于实际查询)扫描左表的索引而不是表本身。它可以为此构建必要的关键数据。如果扫描索引比扫描表快,那可能是速度差异的原因。
主索引的目的是通过排序和创建一棵大树来整理事物(至少在 SQL Server 中)。B-tree 如果更具体。这意味着每条记录的键都属于树中的某个位置(或存储桶)。
那么为什么向 FIRST 表添加键有助于加快查询速度呢?原因是执行查询时,FIRST 表正在排序,因为 SECOND 表由于存在主键而已经排序。这是因为比较两个排序列表比对每个元素进行二进制搜索要快得多。在这种情况下,由于没有索引,排序需要时间。
顺便说一句,不要被我说的话弄糊涂了。不是真正比较列表,而是对上图的索引树进行更多的修剪,例如如果 T1 有 K1、K2、K3,并且 K1 可以在图片的第二个桶中找到,则不需要检查第一个桶的其余部分的键。
MySQL 没有哈希连接。