什么是SQL选择的Big-O?

Gra*_*ton 22 mysql sql big-o

什么是SQL选择的Big-O,对于一个包含n行的表,我想要返回m结果?

什么是一个Update,或delete,或Create操作的大O ?

我一般都在谈论mysql和sqlite.

God*_*eke 43

由于您不控制所选的算法,因此无法直接了解.但是,如果没有索引,SE​​LECT应为O(n)(表扫描必须检查每个记录,这意味着它将按表的大小进行缩放).

对于索引,SE​​LECT可能是O(log(n))(尽管它取决于用于索引的算法和数据本身的属性,如果对于任何真实表都适用).要确定任何表或查询的结果,您必须求助于分析现实世界数据.

没有索引的INSERT应该非常快(接近O(1)),而UPDATE需要首先找到记录,因此比得到你的SELECT更慢(稍微).

当索引树需要重新平衡时,带索引的INSERT可能会再次处于O(log(n ^ 2))的球场,否则更接近O(log(n)).如果UPDATE在SELECT成本之上影响索引行,则会发生相同的减速.

一旦你谈到混合中的JOIN,所有的赌注都会被取消:你必须分析并使用你的数据库查询估算工具来阅读它.另请注意,如果此查询对性能至关重要,则应随时重新配置,因为查询优化程序使用的算法将随着数据负载的变化而更改.

要记住的另一件事是......大O不告诉你每笔交易的固定成本.对于较小的表,这些可能高于实际工作成本.例如:单行的跨网络查询的设置,拆除和通信成本肯定不仅仅是在小表中查找索引记录.

正因为如此,我发现能够在一个批处理中捆绑一组相关查询对性能的影响远远大于我对数据库所做的任何优化.