কেন নির্বাচন করুন SELECT foo এর চেয়ে দ্রুততর হবে?


28

মান এবং হ্যাশগুলির একটি সারণী বিবেচনা করুন, এর মতো:

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| val        | char(9)  | NO   |     | NULL    |                |
| val_hashed | char(50) | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

নিম্নলিখিত কোয়েরি 0.00 সেকেন্ডের মধ্যে শেষ হয়:

SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;

যাইহোক, এই কোয়েরিটি 3 মিনিট 17 সেকেন্ড সময় নেয়:

SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;

আমি দেখতে পাচ্ছি যে ক্যোয়ারী চলাকালীন প্রক্রিয়া তালিকাটি এটি স্থিতি হিসাবে দেখায় Sorting result। পরিস্থিতি সম্পূর্ণ পুনরুত্পাদনযোগ্য। নোট করুন যে INSERTটেবিলটিতে অবিচ্ছিন্নভাবে অপারেশন করে চলেছে আরও একটি প্রক্রিয়া ।

কেন আরও নির্দিষ্ট ক্যোয়ারী ক্যোয়ারীর চেয়ে বেশি সময় নিতে পারে *? আমি সবসময় বিশ্বাস করি যে *কার্য সম্পাদনের কারণে অনুসন্ধানগুলি বিশেষত এড়ানো উচিত।


7
প্রথম বিবৃতি সম্ভবত idপ্রথম সারিটি সন্ধান করতে প্রাথমিক কী সূচক ব্যবহার করে । দ্বিতীয়টিকে সম্পূর্ণ ফলাফলটি (আনডেক্সড) valকলামে বাছাই করতে হবে।
a_horse_with_no_name

8
ORDER BY NUMBERসিনট্যাক্স বেশ প্রবণ ত্রুটি।
usr ডিরেক্টরির

2
আপনার সর্বশেষ মন্তব্যে যুক্ত হওয়া, SELECT *একটি কলাম সূচকের সাথে একত্রিত করা কোন কলামটি ORDER BYবাছাই করা হচ্ছে তা অবহেলা করছে - *এস এড়ানোর অন্য কারণ ...
এলসি।

@ এলসি।, আপনার অর্থ কী?
পেসারিয়ার

@ পেসারিয়র বলতে চাইছি এটি *স্পষ্ট নয়। সুতরাং "আমাকে সমস্ত কলাম দিন এবং তৃতীয়টি অনুসারে বাছাই করুন" বলতে "সুপার মার্কেটে যান এবং আপনি কতটা ট্র্যাফিক লাইট পাস করেছেন তা আমাকে বলুন"
ততক্ষণে নির্দোষ

উত্তর:


33

বাক্যাংশটি ORDER BY 1বিভিন্ন কলামকে বোঝায়; প্রথমটি এটি idদ্বিতীয়টি হবে val। যেহেতু idমূল তাই এটি সূচকযুক্ত order byহবে এবং এটি কাজের ক্ষেত্রে একটি তুচ্ছ পরিমাণ হবে। করতে order by val, কিন্তু, সিস্টেম যে সারি, অনুসারে বাছাই সম্পূর্ণ টেবিল পুনরুদ্ধার করতে হবে val, তবে তাদেরকে সারির শুধু একটি বেছে নিন।

উভয় প্রশ্নের পরিবর্তন করুন order by idএবং আমার ধারণা আপনার মৃত্যুদন্ড কার্যকর করার সময় প্রায় একই রকম হবে।


3
কখনও কখনও জটিল প্রশ্নগুলি সেগুলি হয় যা আমাদের মুখের দিকে ঝকঝকে করছে। ধন্যবাদ, মাইকেল!
dotancohen

7

আপনার প্রশ্নের মধ্যে পারফরম্যান্স পার্থক্যটি এমজি দ্বারা ভালভাবে ব্যাখ্যা করা হয়েছে। আমি এটি সম্বোধন করতে যাচ্ছি:

আমি সবসময় বিশ্বাস করি যে * কার্যকারিতা বিশেষত পারফরম্যান্সের কারণে এড়ানো উচিত।

select *নিজে থেকে কোনও বিশেষ জরিমানা বহন করে না, অপব্যবহার করা হলে এটি সমস্যাযুক্ত। একটি একক-সারণী ক্যোয়ারিতে এটি ঠিক কাজ করে। এখন 20 টি কলাম সহ সেই টেবিলে যোগ দিন এবং পরে প্রতিটি কলামের সাথে আরও 5 টি টেবিলের সাথে যুক্ত হন। এখন এটি একটি সমস্যা। সুতরাং যে লোকেরা ব্রড, ব্যান্ড-এইডকে "কখনই এক্স করবে না" শেখায় কেন তা ব্যাখ্যা না করেই।


3
SELECT *এমনকি একটি একক-টেবিল ক্যোয়ারির জন্যও এটি একটি সমস্যা হতে পারে। উদাহরণস্বরূপ, SELECT * FROM hashes ORDER BY val;সম্ভবত একটি পূর্ণ টেবিল স্ক্যান করবে এবং তারপরে একটি সাজানোর সময় SELECT val FROM hashes ORDER BY val;কেবলমাত্র একটি পূর্ণ সূচী স্ক্যান করবে এবং কোনও ধরণের (ভ্যালুতে একটি সূচক বিদ্যমান বলে ধরে নেওয়া হবে)। সুতরাং, এটি আমাদের প্রয়োজনীয় ফলাফলগুলি বেছে নিতে কখনই ব্যথিত হয় না।
ypercubeᵀᴹ

আমি ধরে নিলাম আপনি এই দেখেছেন? sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/…
ম্যাক্স ভার্নন

@ টাইপ्यूब, আমাদের select(*)কেবল উপ- নির্বাচন হিসাবে ব্যবহৃত হলেও তা কি ঘটে ? যেহেতু এটি একটি এমবেডেড নির্বাচন রয়েছে, তাই মাইএসকিউএল নির্বাচন করা প্রয়োজন এমন আসল কলামগুলি বের করার জন্য কি যথেষ্ট স্মার্ট হবে না?
পেসিয়ার 18

@ পেসারিয়র মাইএসকিএল অপ্টিমাইজারটিতে আপনি যে সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে "স্মার্টনেস" এর বিভিন্ন স্তর রয়েছে। জিনগতভাবে, এটি নেস্টেড সাবকোয়ারিগুলির বিষয়ে বেশ বোবা ছিল, তাই আপনি তাকে যা কিছু করতে সাহায্য করতে পারেন, ভাল ছিল।
ypercubeᵀᴹ

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