【问题标题】:mySQL select from primary key and select from foreign key big OmySQL 从主键中选择和从外键中选择 big O
【发布时间】:2018-08-14 14:36:35
【问题描述】:
我还没有找到任何关于 mySQL 从外键和主键中选择查询的大 O 的真实数据。以下是两个示例查询:
SELECT some_column FROM some_table WHERE primary_key = some_value
SELECT some_column FROM some_table WHERE foreign_key = some_value
这两个查询的大 O 是多少?
提前感谢您的帮助!
【问题讨论】:
标签:
mysql
database
performance
【解决方案1】:
假设表是ENGINE=InnoDB...
PRIMARY KEY 与数据“聚集”在一起,因此当WHERE primary_key = some_value 向下钻取 BTree 到叶节点时,它会在那里找到整个记录。
二级索引(我假设 foreign_key 已编入索引)也是 BTree,但叶节点包含它找到的行的 PRIMARY KEY 的副本。然后执行第二次查找以获取数据(包括some_column)。
根据该逻辑,辅助键查找所需的时间大约是 PK 查找时间的两倍。但是,由于在任何 SELECT 中都有很多其他内容,因此您很少会测量 2x。
还有其他问题...
如果 some_column 是 PK 中的列之一,那么您的第二个 SELECT 就像第一个一样。
如果你有INDEX(foreign_key, some_column),那么这会更快,因为任务会在钻取这个键的BTree之后完成。也就是说,不需要第二个带PK的探针。
如果WHERE 中的测试不涉及索引,则执行“表扫描”。对于一千行表,查询将花费一千倍的时间。 (实际上并没有太大的区别,同样是由于开销。)无论如何,可以在几毫秒内扫描一千行,因此“小”表上缺少的索引通常不是很大交易。
这只是索引和优化相关的数十个甚至数百个微妙事物中的一小部分。
更多,但不是全部,花絮被发现here。