2016-09-07 3 views
2

から行の間違ったシーケンスを与えるクエリを選択:私はこのような出力を得ることを期待MySQLは、私は、クエリを選択し、このMySQLを実行しているプラ​​イマリキー

select * from ABC where column_value=1; 

ID Name 
1  AAA 
2  BBB 
3  CCC 

をしかし、その代わりに、私はこれを取得しています:

ID Name 
2  BBB 
1  AAA 
3  CCC 

誰も私にこのような振る舞いをしている理由を教えていただけますか?

+0

「column_value」で示される列はどれですか? – 1000111

+0

"order by"を使用してinorderを取得する – jophab

+0

プライマリキーをAUTO_INCREMENTに設定しましたか?そうでない場合は、手動で入力した場合、そのような出力が生じる可能性があります。 –

答えて

4

データベースは、テーブルからデータを読み取るための最も速い方法を使用する傾向があります。これは、ORDER BY句を使用しない限り、データがより速く見つかると、データを任意の順序で返す可能性があることを意味します。

+0

ありがとうございます。しかし、私の前提では、mysqlは主キーでデータを取得します。これの前に私は正しくデータを得ました。 – Nik0990

+1

'where column_value = 1'は、異なるインデックスを使用してプライマリキーを使用する可能性があり、結果が異なる場合があります。 'ORDER BY'を使わない限り、決して注文に頼るべきではありません。 –

0

デフォルトでは、ieです。デフォルトのプライマリキーは "order by"に使用されますが、いくつかの行を削除した可能性がありますか?

+0

IDが主キーです。レコードを削除すると挿入/選択の順番が有効になります – Nik0990

+0

はい、注文しないとIDになり、更新/削除が予想される出力に影響する可能性があります。 – iSensical

0
select * from ABC where column_value=1; 

クエリでは返された行の並べ替えが指定されていません。

SQLは、タプルのセットを処理する言語であり、a setは、定義上、順序付けされていないアイテムの集合です。

ある状況下では、あるデータベースエンジンまたは別のデータベースエンジンが特定の順序(行番号PK f.e.でソート)で行を返すという事実は実装の詳細です。言語によって必須ではなく、いつでも変更できます。

さらに、クエリで返される行の順序が指定されていない場合、データベースエンジンはどのような方法であっても高速に取得するのに適した方法を使用します。順序は外部要因に依存する可能性があり、時間とともに変化する可能性があります。たとえば、クエリから返された行をテーブルから削除してから別の順序で挿入すると、同じクエリを後で実行すると、以前とは異なる順序で行が返される可能性があります。

小さい表の上にORDER BY句を含まない問合せについての洞察(正確でも信頼性もない)として、データベースは表のデータ内に見つかった順序で行を戻しますインデックスを読み取ることはありません。

小さいテーブルの場合、エンジンは不要なときにインデックスの読み込みをスキップし、テーブルのデータに直接進みます。このようにして、処理に追加の価値を提供しないディスクアクセスが不要になります。

0
select * from ABC order by ID where column_value=1; 

order by機能を使用して、目的の結果を得ることができます。

関連する問題