我确信执行时间与 MySQL 查询中的行数成正比。我的问题是,比例是多少?查询的执行时间会随着数据库变大而显着增加还是只增加一点点?
任何有关该主题的信息将不胜感激
不,不是。
Aselect * from table
将按比例花费更长的时间(如果您有很多行,对于只有四行的表,它不会比有两行的表花费两倍的时间,这将由“固定成本”主导)
无论表大小如何, Aselect * from table limit 10
都将花费相同的时间。
Aselect count(*) from table
在 MySQL 上是瞬时的,与表大小无关。
Aselect * from table where primary_key = ?
将以对数方式缩放(因为使用了 B 树索引)。
Aselect count(*) from table where non_indexed_column = ?
将按比例花费更长的时间,但 aselect count(*) from table where indexed_column = ?
不会。
如果行数加倍, Aselect * from table_a join table_b
将花费四倍的时间。Aselect * from table_a join table_b using (column_a = indexed_column_b)
应该线性缩放。
如果行数翻倍, Aselect * from table_a order by unindexed_column
将花费两倍以上的时间。Aselect * from table_a order by indexed_column
可以按比例缩放,但 aselect * from table_a where something = ? order by indexed_column
可能不会。
一旦表不再适合内存,所有操作都会花费更多时间。或者,如果您在内存用于其他表时运行查询。这可能是一堵真正的墙,执行时间会突然飙升。
此外,您正在讨论“查询中的行”(选择的行)和“表中的行”。这两者都有影响。表中已删除行的“存在”也会产生影响。
SELECT 查询执行时间的最大因素是它们是否需要对数据库进行完整扫描或是否可以使用索引。对于前一种情况,执行时间随着数据库的增长而增长。对于后者,它没有(至少不显着)。
执行时间与行数和列数成正比,您必须将索引键放入列,然后从该列构建查询,这将运行得更快!