mySQL从主键中选择并从外键中选择big O

时间:2018-08-14 14:36:35

标签: mysql database performance

我还没有从外键和主键中找到有关mySQL select查询大O的任何真实数据。这是两个示例查询:

SELECT some_column FROM some_table WHERE primary_key = some_value
SELECT some_column FROM some_table WHERE foreign_key = some_value

这两个查询的最大问题是什么?

感谢您的任何帮助!

1 个答案:

答案 0 :(得分:0)

假设表为ENGINE=InnoDB ...

PRIMARY KEY与数据进行了“聚类”,因此,WHERE primary_key = some_value在BTree向下钻取到叶节点时,会在其中找到整个记录。

辅助索引(我假设对foreign_key进行了索引)也是BTree,但是叶节点包含PRIMARY KEY所找到的行的副本。然后执行第二次查找以获取数据(包括some_column)。

基于该逻辑,辅助键查找所需时间大约是PK查找所需时间的两倍。但是,由于SELECT中还有很多其他内容,因此您很少会测量2倍。

还有其他问题...

如果some_column是PK中的列之一,那么您的第二个SELECT会像第一个一样。

如果您有INDEX(foreign_key, some_column),则这样做会更快,因为在钻取此键的BTree之后任务将完成。也就是说,不需要第二个带有PK的探针。

如果WHERE中的测试不包含索引,则执行“表扫描”。对于一千行的表,查询将花费一千倍的时间。 (实际上,由于开销而导致的差异并不大。)无论如何,可以在几毫秒内扫描一千行,因此“微小”表上丢失的索引通常不大交易。

这是索引和优化所伴随的数十个,甚至数百个微妙的事情中的一些小消息。

发现了更多但并非全部花絮here