我还没有从外键和主键中找到有关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
这两个查询的最大问题是什么?
感谢您的任何帮助!
答案 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。