5

以下に示すように、2つのテーブルを作成し、値を挿入しました。

表1

create table maxID (myID varchar(4));

insert into maxID values ('A001');
insert into maxID values ('A002');
insert into maxID values ('A004');
insert into maxID values ('A003');

表 2

create table maxID2 (myID varchar(4) PRIMARY KEY);

insert into maxID2 values ('A001');
insert into maxID2 values ('A002');
insert into maxID2 values ('A004');
insert into maxID2 values ('A003');

クエリを実行すると

SELECT myId, @rowid:=@rowid+1 as myrow 
FROM maxID, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

次のように出力されます

+++++++++++++
myid + myrow
+++++++++++++
A003 + 4
+++++++++++++

クエリを実行すると

SELECT myId, @rowid:=@rowid+1 as myrow 
FROM maxID2, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

次のように出力されます

+++++++++++++
myid + myrow
+++++++++++++
A004 + 4
+++++++++++++

2 つのテーブルの違いは、2 番目のテーブルに myID があることPRIMARY KEYです。

www.sqlfiddle.comで上記のデータ/結果を表示できます。

私の質問は

クエリが同じなのに 2 つの異なる結果が得られるのはなぜですか?

注:この質問は、私の古い質問Getting last record from mysqlに少し関連しています。ここで、ほとんど答えが得られ、Yakは行の順序が保証されていないことを通知しました。:(

4

2 に答える 2

7

これは、選択したフィールドセットが特定のインデックスフィールドセットに完全に含まれている場合、フルスキャンの結果ではなく、このインデックスを使用してデータを取得するためです。

インデックスにはデフォルトの並べ替え順序があるため、生のテーブルデータにない場合、インデックスを使用して抽出されたデータは、全表スキャンからのものとは異なる順序で表示されます。

あなたの場合、主キーを使用しているとき、4番目の行は実際に4番目の行です。これは、内部でmysql(oracle、sql server ...)がデータをより高速に検索するためにこのように編成したためです。

デフォルトで選択された結果の順序が挿入された順序に関連していることが実際に証明されていないという理由だけで、偶然にも両方のクエリで同じ結果が得られた可能性があることに注意してください。

最後に、mysqlで特定の順序(ここで説明されているような)のインデックスを追加して、行がDESCの順序で取得されるように計画している場合は、そうではないため、追加できないことを警告します。まだmysqlで許可されている機能:

index_col_name指定は、ASCまたはDESCで終了できます。これらのキーワードは、昇順または降順のインデックス値ストレージを指定するための将来の拡張で許可されます。現在、それらは解析されますが無視されます。インデックス値は常に昇順で保存されます。

于 2012-06-20T18:04:55.837 に答える
4

Primary keys are returned in sorted order by default

そのため、両方のクエリで異なる出力が得られます。

別の例でも確認できます。ここに例があります

于 2012-06-20T18:18:51.367 に答える