মাইএসকিউএলে একটি নির্বাচিত বিবৃতি রেকর্ডগুলির ডিফল্ট অর্ডার কী?


66

মনে করুন আপনার নীচের সারণী এবং ডেটা রয়েছে:

create table t (
    k int,
    v int,
    index k(k)
    ) engine=memory;

insert into t (k, v)
values (10, 1),
       (10, 2),
       (10, 3);

select * from t where k = 10কোনও order byধারা ছাড়াই জারি করার সময় , মাইএসকিউএল ডিফল্টরূপে রেকর্ডগুলি কীভাবে বাছাই করে?

উত্তর:


75

Reposting আমার উত্তর SQL সার্ভার সংক্রান্ত একটি অনুরূপ প্রশ্নের:

এসকিউএল ওয়ার্ল্ডে, অর্ডার কোনও ডেটা সেটের অন্তর্নিহিত সম্পত্তি নয়। সুতরাং, আপনি আপনার আরডিবিএমএসের কাছ থেকে কোনও গ্যারান্টি পাবেন না যে কোনও নির্দিষ্ট ক্রমে আপনার ডেটা ফিরে আসবে - বা এমনকি একটি ধারাবাহিক ক্রমে - যদি না আপনি কোনও অর্ডারের মাধ্যমে নিজের ডেটা সম্পর্কে জিজ্ঞাসা করেন।

সুতরাং, আপনার প্রশ্নের উত্তর দিতে:

  • মাইএসকিউএল রেকর্ডগুলি বাছাই করে তবে এটি কোনও সামঞ্জস্যতার কোনও গ্যারান্টি ছাড়াই চায়।
  • যদি আপনি কোনও কিছুর জন্য এই অর্ডারের উপর নির্ভর করতে চান, আপনাকে অবশ্যই নিজের কাঙ্ক্ষিত অর্ডারটি ব্যবহার করে নির্দিষ্ট করতে হবে ORDER BY। অন্য কিছু করার জন্য নিজেকে অবাঞ্ছিত বিস্ময়ের জন্য সেট আপ করা।

এটি কেবলমাত্র মাইএসকিউএল নয়, সমস্ত এসকিউএল এর সম্পত্তি। এসকিউএল -২২ স্পেসে প্রাসঙ্গিক পাঠ্যটি হ'ল:

যদি <দফা দ্বারা আদেশ> নির্দিষ্ট না করা থাকে তবে কিউ এর সারিগুলির ক্রম প্রয়োগকরণ-নির্ভর।

কার্সারগুলির জন্য বিশেষে পাঠ্যের অনুরূপ বিট রয়েছে।


26

ORDER BYধারাটির অভাবে সারিগুলির ক্রমটি হতে পারে:

  • যে কোনও দুটি স্টোরেজ ইঞ্জিনের মধ্যে পৃথক;
  • আপনি যদি একই স্টোরেজ ইঞ্জিন ব্যবহার করেন তবে এটি একই স্টোরেজ ইঞ্জিনের যে কোনও দুটি সংস্করণের মধ্যে পৃথক হতে পারে; এখানে উদাহরণস্বরূপ , "সারিগুলির ক্রম" এ স্ক্রোল করুন।
  • স্টোরেজ ইঞ্জিন সংস্করণটি যদি একই হয় তবে মাইএসকিউএল সংস্করণটি আলাদা, সেই সংস্করণগুলির মধ্যে ক্যোরি অপটিমাইজার পরিবর্তনের কারণে এটি ভিন্ন হতে পারে;
  • যদি সবকিছু একই হয় তবে এটি চাঁদের ধাপের কারণে আলাদা হতে পারে এবং এটি ঠিক আছে।

10

সন্নিবেশ আনর্ডার্ড, বিশৃঙ্খল, আগমনের সময়। সূচকটি তৈরি করা হয় যাতে সংযুক্ত তালিকায় উপাদানগুলি যথাযথ স্থানে সন্নিবেশ করা হয় যেখানে সূচক হয়। একটি সূচকের জন্য ত্রিভুজযুক্ত লিঙ্কযুক্ত তালিকার কথা চিন্তা করুন, যেখানে আপনার এক সূচক উপাদান থেকে পরের দিকে অগ্রসর চলমান লিংক রয়েছে, ট্র্যাভারসাল এবং অখণ্ডতার উদ্দেশ্যে অনুসন্ধানের পিছনে থাকা লিঙ্ক এবং তারপরে সারণীতে প্রকৃত রেকর্ডগুলির জন্য পয়েন্টারগুলির একটি সেট প্রশ্নযুক্ত সূচিযুক্ত উপাদানটি মেলে।

আসল ডেটা, স্টোরেজ বিশৃঙ্খল। উপাত্তের সাথে সম্পর্কিত সূচক, স্টোরেজ এবং নির্মাণে আদেশ করা। অর্ডার করা বা অর্ডারহীন, ডেটা আসল টান জড়িত ক্যোয়ারির উপর নির্ভর করে।


4

এটি যখন মেমোরি স্টোরেজ ইঞ্জিনের দিকে আসে , তখন আমি আদেশটি সন্নিবেশের ক্রম হিসাবে প্রত্যাশা করব কারণ ডিফল্ট সূচক বিন্যাসের HASHপরিবর্তে BTREEএবং সূচী বিন্যাসের কোনও দিকই ব্যবহৃত হচ্ছে না। যেহেতু আপনি কে, এবং কে একই মান হিসাবে তালিকাবদ্ধ করেছেন, সমস্ত কী একই হ্যাশ বালতিতে প্রবেশ করে । যেহেতু একটি হ্যাশ বালতি পপুলেশন করার জন্য যুক্ত জটিলতা অনুমান করার কোনও কারণ নেই তাই সন্নিবেশের ক্রমটি সার্থক করে তোলে।

আমি আপনার একই নমুনা টেবিল এবং ডেটা নিয়ে 30 INSERTটি দৌড়েছি এবং আমি এটি পেয়েছি:

mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.00 sec)

mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30  Duplicates: 0  Warnings: 0

mysql> select * from t;
+------+------+
| k    | v    |
+------+------+
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
+------+------+
30 rows in set (0.00 sec)

mysql>

আমি কে: 10 এবং 11 এর জন্য দুটি পৃথক মান যুক্ত করে পরীক্ষা করার সিদ্ধান্ত নিয়েছি আমি এটি পেয়েছি:

mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.02 sec)

mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t values
    -> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
    -> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30  Duplicates: 0  Warnings: 0

mysql> select * from t;
+------+------+
| k    | v    |
+------+------+
|   11 |    1 |
|   11 |    2 |
|   11 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   11 |    1 |
|   11 |    2 |
|   11 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
+------+------+
30 rows in set (0.00 sec)

mysql>

সন্নিবেশের ক্রম দেখে মনে হচ্ছে। k = 11 এর পরে প্রথম কীটি হ্যাশ করা হয়েছিল 10। 11 এর পরিবর্তে 10 টি প্রথম সন্নিবেশ সম্পর্কে কী? এটি আমি পেয়েছি:

mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.02 sec)

mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
    -> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
    -> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30  Duplicates: 0  Warnings: 0

mysql> select * from t;
+------+------+
| k    | v    |
+------+------+
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   11 |    1 |
|   11 |    2 |
|   11 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   11 |    1 |
|   11 |    2 |
|   11 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
+------+------+
30 rows in set (0.00 sec)

mysql>

এটি সর্বসম্মত !!! অর্ডার অফ ইনসার্টেশন উত্তর।

মেমোরি স্টোরেজ ইঞ্জিনের জন্য সূচকগুলি ব্যবহার করার বিষয়ে সিডেনোটেস

মেমোরির জন্য সীমা অনুসন্ধানগুলিতে তুলনামূলকভাবে ভয়াবহ পারফরম্যান্স থাকবে।

একটি সূচক তৈরি করার সময়, আপনি সূচকের USING BTREEসংজ্ঞা সহ ধারাটি নির্দিষ্ট করতে পারেন । এটি পরিসীমা অনুসন্ধানের জন্য জিনিসগুলিকে উন্নত করবে।

একটি নির্দিষ্ট সারি খুঁজছেন পারেন সঙ্গে কর্মক্ষমতা একই ফল হবে HASHবা BTREE

আপডেট ২০১১-০৯-২২ ১১:১৮ ইডিটি

আমি আজ আকর্ষণীয় কিছু শিখেছি। আমি পারকোনা থেকে @ লরেনাস বিভিনিস সরবরাহিত লিঙ্কটি পড়েছি: পারকোনা লিঙ্কটি মাইএসকিউএল 5.5.15 এর জন্য স্মৃতি সারণী সম্পর্কে কিছু বলেছে :

সারিগুলির ক্রম

অর্ডার বাইর অনুপস্থিতিতে, পূর্ববর্তী স্মৃতি বাস্তবায়নের চেয়ে রেকর্ডগুলি অন্য কোনও ক্রমে ফিরে আসতে পারে। এটি একটি বাগ না। অর্ডার বাই দফা ব্যতীত কোনও নির্দিষ্ট আদেশের উপর নির্ভর করে যে কোনও অ্যাপ্লিকেশন অপ্রত্যাশিত ফলাফল দিতে পারে। অর্ডার বাই ব্যতীত একটি নির্দিষ্ট অর্ডার হ'ল স্টোরেজ ইঞ্জিন এবং ক্যোয়ারী অপ্টিমাইজার প্রয়োগের একটি পার্শ্ব প্রতিক্রিয়া যা ছোট মাইএসকিউএল রিলিজের মধ্যে পরিবর্তন হতে পারে will

এটি আজ দেখার জন্য আমার জন্য একটি ভাল লিঙ্ক ছিল। আমি যে উত্তরটি দিয়েছি তা প্রমাণ করে যে আমি যে টেবিলটি লোড করেছি তা পুনরুদ্ধার করা হয়েছিল যাতে আমি আজকের এসএসকিউএল 5.5.12 তে প্রত্যাশা করেছি। যেমনটি পেরকোনা এবং @ লৌরিনাস বিভিনিস নির্দেশ করেছেন , অন্য কোনও ছোটখাট মুক্তির কোনও গ্যারান্টি নেই।

সুতরাং, আমার উত্তর রক্ষার চেষ্টা করার পরিবর্তে, আমি বরং উত্তরটিকে লরিএনাস বিভিনিস থেকে প্রচার করব কারণ এটি সর্বাধিক বর্তমান তথ্য। @ লৌরিনাস বিভিনিস-এর জন্য কুদোস এবং টুপিগুলি বন্ধ রয়েছে । আমি @ আইভরকে বিনীতভাবে প্রশ্নের উত্তরগুলি সংস্করণ-নির্দিষ্ট উত্তর প্রচার না করার জন্য বিনীতভাবে নির্দেশ দেওয়ার জন্য ধন্যবাদ জানাতে চাই । তারা উভয়ই আজ আমার উপভোগ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.