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