2

私は、彼が話していることを知っているように見える誰かから、会議の講演者のスライドでこの声明を読んだところです。

MySQL では、列の値をフェッチすると行全体が強制的に読み取られます [したがって、コンテンツを積極的にフェッチすることは理にかなっています]。

だから私の質問は: これは、複数列のデータベース テーブル クエリで、次のクエリのコストがまったく同じであることを意味しますか? これは、MySQL についてこれまで聞いたことのあるすべてのことと重なっているからです。

クエリ 1:

SELECT id FROM mytable WHERE flag = 1;

クエリ 2:

SELECT * FROM mytable WHERE flag = 1;
4

2 に答える 2

4

これは正しくないと思います。たとえば、'SELECT id...' を使用する代わりに 'SELECT *...' を使用したために、特定のアプリケーションのパフォーマンスが非常に悪いケースについて、卒業式の先生が教えてくれたのをはっきりと覚えています。

両方の方法で一連の SQL クエリの前後にタイムスタンプを実行し、その結果を比較する実際の例を作成してみてください。

編集: SQL Fiddle ( http://sqlfiddle.com/#!2/32954/2 ) で単純なスキーマを試してみるSELECT * FROM tableSELECT id FROM table、「*」の平均時間は 95 行で約 10 ミリ秒、 「id」のものは、同じ 95 行で 1 ミリ秒でした。SQL Fiddle が信頼できる情報源であるかどうかはわかりませんが、アイデアが得られると思います。

于 2013-08-08T17:17:04.077 に答える
1

MS SQLこれは、ディスク操作についていつ説明するかについての正しい情報です。1 つの単純な識別子を含む 1 つの単純な選択で、複数の行が読み取られます。

IMHO MSSQL DBFetch操作は、8 ページ (512kb?) のデータを DB キャッシュに読み込みます。これが、結果として自然に増加する識別子を使用したデータまたはデータの読み取りを含むクラスター化インデックスが非常に強力な理由です。データベースは、最初のディスク フェッチ内で数行をキャッシュに読み取り、次の選択がキャッチにヒットした場合、ハードディスクに移動する必要はありません。

の間には間違いなく違いがあることに注意してください

SELECT * FROM ...

SELECT ID FROM ...

サーバーはすべてのプロパティをシリアライズする必要はありません。ネットワーク トランスポートにも時間がかかり、クライアントのデシリアライズにも時間がかかります。

于 2013-08-17T10:52:06.400 に答える