実行時間はMySQLクエリの行数に正比例すると確信しています。私の質問は、どのくらいの割合ですか?データベースが大きくなるか、少しだけ大きくなると、クエリの実行時間は大幅に増加しますか?
主題に関するどんな情報でも高く評価されます
実行時間はMySQLクエリの行数に正比例すると確信しています。私の質問は、どのくらいの割合ですか?データベースが大きくなるか、少しだけ大きくなると、クエリの実行時間は大幅に増加しますか?
主題に関するどんな情報でも高く評価されます
いいえ、そうではありません。
Aselect * from table
は比例して長くかかります(行が多い場合、4行しかないテーブルの場合、2行のテーブルの2倍の時間はかかりません。これは、「固定費」によって支配されます)
テーブルのサイズに関係なく、 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 = ?
は比例して長くかかりますが、そうでselect count(*) from table where indexed_column = ?
はありません。
行数が2倍になると、 Aのselect * from table_a join table_b
4倍の時間がかかります。Aselect * from table_a join table_b using (column_a = indexed_column_b)
は線形にスケーリングする必要があります。
行数が2倍になると、 Aselect * from table_a order by unindexed_column
は2倍以上の時間がかかります。Aselect * from table_a order by indexed_column
は比例してスケーリングできますが、そうでselect * from table_a where something = ? order by indexed_column
ない場合があります。
テーブルがメモリに収まらなくなるとすぐに、すべての操作にかなり長い時間がかかります。または、メモリが他のテーブルに使用されているときにクエリを実行する場合。これは、実行時間が突然屋根を通過することで、実際にヒットする壁になる可能性があります。
また、「クエリ内の行」(選択された行)と「テーブル内の行」についても取り上げていました。これらは両方とも影響があります。テーブル内の削除された行の「存在」も影響を与える可能性があります。
SELECTクエリの実行時間の最大の要因は、データベースの完全なスキャンが必要か、インデックスを使用できるかどうかです。前者の場合、データベースが大きくなるにつれて実行時間が長くなります。後者の場合、そうではありません(少なくとも重要ではありません)。
実行時間は、行数と列数に比例します。クエリを作成する列から、インデックスキーを列に配置する必要があります。これにより、実行速度が大幅に向上します。