您必须完全扫描的桌子上的索引? (MySQL的)

时间:2011-01-07 22:29:45

标签: mysql indexing database-agnostic

我在这里很难过。

我有2张桌子,我还要加入第一张(大约500万条记录)和第二张(大约220万条记录),以便找出第一张而不是第二张的记录。 (典型的“b.attribute为null”废话)

为什么(如何)在第一个表上使用索引?无论如何,它必须经历第一个表中的每条记录,然而当我尝试在第一个表上没有任何索引(或主键......没有必要,因为这只是ETL)时,它会爬行。

顺便说一下,使用innodb。

帮助?

编辑:第二个表已编入索引。第一个不是。

4 个答案:

答案 0 :(得分:2)

这应该对它有所了解:http://dev.mysql.com/doc/refman/5.5/en/innodb-index-types.html

简而言之:所有InnoDB表都有所谓的“聚簇索引”(即使没有在表上定义显式索引,InnoDB也会自动创建它),其中存储了实际的行。

答案 1 :(得分:1)

我不知道这是否正在发生,但从理论上讲,它可能(取决于实际查询)数据库引擎扫描左表的索引而不是表本身。它可以为此构建必要的关键数据。如果扫描索引比扫描表更快,则可以解释速度差异。

答案 2 :(得分:1)

主索引的目的是通过排序和创建一个大树(至少在SQL Server中)来整理。 B树如果更具体。这意味着每个记录的密钥属于树中的某个位置(或桶)。

alt text

那么为什么在FIRST表中添加密钥有助于加快查询速度呢?原因是当执行查询时,FIRST表正在排序,因为由于存在主键,SECOND表已经已经排序。这是因为比较两个排序列表比对每个元素进行二元搜索要快得多。在这种情况下,由于没有索引,因此排序需要时间。

顺便说一句,不要被我说的话弄糊涂。它不是真正比较列表,而是更多地修剪上面图片上的索引树,例如如果T1有K1,K2,K3和K1可以在图片的第二个桶中找到,那么就不需要检查第一个桶是否有其余的密钥。

答案 3 :(得分:0)

MySQL没有散列连接。