মাইএসকিউএল-এ, যেখানে একটি ক্লাউজে কলামগুলির ক্রম ক্যোয়ারী কর্মক্ষমতা প্রভাবিত করে?


38

আমার কিছু নির্দিষ্ট ডাটাবেস ক্যোয়ারীতে পারফরম্যান্স সমস্যা রয়েছে যার বড় সম্ভাব্য ফলাফল সেট রয়েছে।

প্রশ্নে থাকা ক্যোয়ারী, ANDWHERE ধারাটিতে আমার তিনটি রয়েছে

ধারাগুলির আদেশের বিষয়টি কী বিবেচনা করে?

হিসাবে, যদি আমি ASI_EVENT_TIME ধারাটি প্রথমে রাখি (যেহেতু এটি কোনও দফার মধ্যে সর্বাধিক ফলাফল সরিয়ে ফেলবে।

এটি কি ক্যোয়ারির রান সময়কে উন্নত করবে?

প্রশ্ন:

SELECT DISTINCT  activity_seismo_info.* 
FROM `activity_seismo_info` 
WHERE 
    activity_seismo_info.ASI_ACTIVITY_ID IS NOT NULL  AND 
    activity_seismo_info.ASI_SEISMO_ID IN (43,44,...,259) AND 
    (
        activity_seismo_info.ASI_EVENT_TIME>='2011-03-10 00:00:00' AND 
        activity_seismo_info.ASI_EVENT_TIME<='2011-03-17 23:59:59'
    ) 

ORDER BY activity_seismo_info.ASI_EVENT_TIME DESC

ক্যোয়ারির ব্যাখ্যা:

+----+-------------+---------+-------+---------------------------+--------------+---------+------+-------+-----------------------------+ 
| id | select_type | table   | type  | possible_keys             | key          | key_len | ref  | rows  | Extra                       |
+----+-------------+---------+-------+---------------------------+--------------+---------+------+-------+-----------------------------+ 
|  1 | SIMPLE      | act...o | range | act...o_FI_1,act...o_FI_2 | act...o_FI_1 | 5       | NULL | 65412 | Using where; Using filesort |
+----+-------------+---------+-------+---------------------------+--------------+---------+------+-------+-----------------------------+

ব্যবহার:

পিএইচপি 5.2

মাইএসকিউএল 5.0.51a-3ubuntu5.4

চালক 1.3

সিমফনি ২.২.২


অর্ডারটি সম্ভবত এত দিন নিচ্ছে। "ফাইলসোর্ট ব্যবহার" অত্যন্ত ধীর হতে পারে। অর্ডার বাই ব্যবহারের চেয়ে অনেক বেশি দ্রুত অ্যাপ্লিকেশন যুক্তিতে অর্ডার করার ব্যবস্থা আমি পেয়েছি।
মামলেমা

আমি স্ট্যাকওভারফ্লোতে কিছুক্ষণ আগে (এই সাইটের আগে) এই একই প্রশ্নটি জিজ্ঞাসা করেছি। আমি সেখানে প্রাপ্ত উত্তরের জন্য লিঙ্কগুলি চেক করুন। stackoverflow.com/questions/3805863/…
স্কট

2
@ মামলেমা - আপনার অ্যাপ্লিকেশনটি আপনার ডাটাবেসের তুলনায় একটি দ্রুত মেশিনে চলমান না থাকলে আপনার আবেদনে অবশ্যই এই অনর্থক বোঝা উচিত নয়, আপনার অ্যাপ্লিকেশনটিতে এই সমস্ত বাছাইয়ের যুক্তির অর্থহীন বোঝার কথা বলা উচিত নয়। order byডাটাবেসের অন্তর্গত।
জ্যাক ডগলাস

উত্তর:


24

আমি এমন মনে করি না. ক্যোয়ারী অপ্টিমাইজারটি যথেষ্ট চালাক হওয়া উচিত।

আপনি যেখানে বিধিগুলি পুনর্বিন্যাসের চেষ্টা করতে পারেন এবং দেখুন যে প্রতিটি ক্ষেত্রে আপনাকে একই কথা বলে।


এই কোয়েরিটি অনুকূলকরণের জন্য কী করা যায় সে সম্পর্কে: ASI_EVENT_TIME এ কোনও সূচক আছে? (আপনি এটি ব্যবহার করে ফলাফলগুলি সাজান হিসাবে এই প্রশ্নের জন্য আমি মনে করি এটি সবচেয়ে গুরুত্বপূর্ণ)।

অন্য দুটি ক্ষেত্রের (এএসআই_এসআইএসএমও_আইডি এবং এএসআই_এসিটিআইভিআইডি) সূচকগুলি রয়েছে?

আপনি টেবিল কাঠামো পোস্ট করলে এটি সহায়ক হবে।


আমি কখনই ইভেন্টের সময়ের সূচি তৈরি করার কথা ভাবিনি। আমি আগামীকাল একটি দেব ডিবিতে চেষ্টা করব এবং দেখছি কোন পার্থক্য আছে কিনা।
প্যাট্রিক

@ পেট্রিক এই সূচকটি ব্যবহার করবে এমন অন্যান্য সমস্ত ক্যোয়ারী ধরে রেখে এই তারিখটি অবতরণ ক্রমে অর্ডার করছে, আপনি সূচী কী (ক্রিয়াকলাপ_সিজো_ইনফো.এএসআই_ইভিটিআইটি টাইম) অবতরণী অর্ডারেও অর্ডার করতে চান।
ম্যাট এম

@ ম্যাটম আমি জানতাম না যে আপনি একটি সূচি কী অর্ডার করতে পারেন। আশ্চর্যজনক আমি যদি সূচক কী অর্ডার করি তবে তা কি বিপরীত দিকের কার্য সম্পাদন ক্রমকে বিন্দুতে আঘাত করবে যে এটি কোনও সূচি কী থেকে খারাপ?
প্যাট্রিক

@ পেট্রিক আপনি ঠিক বলেছেন আমার মস্তিষ্ক এসকিউএল সার্ভারের স্থলে আটকে আছে। আপনি MYSQL এ বাছাইয়ের অর্ডার নির্দিষ্ট করতে পারেন এবং এটি পার্স হবে, তবে তা উপেক্ষা করা হবে না ignored সমস্ত সূচী এমওয়াইএসকিউএলে আরোহিত ক্রমে সাজানো হয়। বিভ্রান্তির জন্য দুঃখিত.
ম্যাট এম

13

ডকুমেন্টেশন থেকে :

যদি টেবিলটির একাধিক-কলাম সূচক থাকে, তবে সূচকের যে কোনও বামতম উপসর্গটি সারিগুলি সন্ধান করতে অপ্টিমাইজার ব্যবহার করতে পারে। উদাহরণস্বরূপ, যদি আপনার (কল 1, কল 2, কল 3) উপর একটি তিন-কলাম সূচক থাকে, আপনি (কল 1), (কল 1, কোল 2), এবং (কল 1, কল 2, কল 3) উপর অনুসন্ধানের সক্ষমতা সন্ধান করেছেন।

মাইএসকিউএল সূচকটি ব্যবহার করতে পারে না যদি কলামগুলি সূচকের বামতম উপসর্গ গঠন করে না।

হ্যাঁ, এটি একটি যৌগিক সূচীতে কলামগুলির ক্রমের সমান হওয়া উচিত ।


4
যদি টেবিলের একাধিক-কলাম সূচক থাকে তবে বাম বিষয়গুলি থেকে কলামগুলি নির্বাচন করা হয় - তবে আপনি যে ক্রমটি নির্বাচন করেন তাতে কিছু আসে যায় না। সুতরাং আপনার যদি একটি, বি, সি এবং আপনার WHERE c = 'foo' AND a = 'bar' AND b = 'foobar'সূচক থাকে এবং সূচকটি এখনও ব্যবহারের জন্য যোগ্য।

10

না, কিছু যায় আসে না।

অপ্টিমাইজারটি এসকিউএলকে বিশ্লেষণ করার পরই সরল রূপান্তরগুলির একটি গুচ্ছটি করে - এটি তাদের মধ্যে একটি।


8

যেখানে ফু ও বার

হিসাবে একই অপ্টিমাইজ

যেখানে বার এবং ফু

যাহোক,

যেখানে অ সমান # 1 এবং অ সমান # 2

উভয় অংশ অনুকূলিত করতে পারে না। উদাহরণ স্বরূপ,

যেখানে 1 এবং 3 এবং বি> 17 এর মধ্যে রয়েছে

INDEX (a, b) বা INDEX (b, a) এর ভাল ব্যবহার করতে পারে না

এটি অন্যরকমভাবে বলতে গেলে, যেখানে 'ক্লাসের অনুচ্ছেদে প্রথমে' = 'পরীক্ষাগুলি একত্রে ব্যবহৃত হয়, তারপরে একটি অ -' = '(IN, BETWEEN,> ইত্যাদি) পরিচালনা করা যায়। একের বেশি কার্যকরভাবে অনুকূলিত হতে পারে না।

আপনার প্রশ্নের কাছে এই জাতীয় 3 টি ধারা রয়েছে।

দেখা যাচ্ছে যে, আইএনডিএক্স (ইভিআইটিটাইম) সম্ভবত সবচেয়ে কার্যকর - এটি কোনও একটি এএনএস-এর সাহায্য করবে এবং এটি অর্ডার দ্বারা "ফাইলসোর্ট" এড়াতে ব্যবহৃত হতে পারে।

যদি কোনও সদৃশ সারি না থাকে (কেন সেখানে হেক থাকবে?), তবে DISTINCT থেকে মুক্তি পান। এটি আরও বেশি চেষ্টা করে।

পারফরম্যান্সের প্রশ্ন জিজ্ঞাসার সময় দয়া করে তৈরি টেবিল প্রদর্শন করুন এবং টেবিলের পরিস্থিতি দেখান।

আপডেট করুন ... আরও নতুন সংস্করণ (উদাঃ, মাইএসকিউএল 5.7), কিছু পরিস্থিতিতে IN( list of constants )প্রায় পছন্দ মতো আচরণ করতে পারে =। এটি নিরাপদে খেলতে, এই ক্রমটি আটকে দিন (প্রতিটি অংশ optionচ্ছিক):

  1. যে কোনও সংখ্যক =
  2. কিছু INs
  3. সর্বাধিক এক পরিসীমা।

1

মাইএসকিউএল যেখানে অপ্টিমাইজেশান ডক বলেছেন:

পাঠযোগ্যতার ত্যাগ করার সময় আপনি পাটিগণিতের ক্রিয়াকলাপ দ্রুত করতে আপনার প্রশ্নগুলি পুনরায় লেখার জন্য প্রলুব্ধ হতে পারেন। কারণ মাইএসকিউএল স্বয়ংক্রিয়ভাবে অনুরূপ অপ্টিমাইজেশন করে , আপনি প্রায়ই এই কাজ এড়াতে, এবং একটি আরো বোধগম্য এবং রক্ষণীয় আকারে ক্যোয়ারী চলে যাবে। মাইএসকিউএল দ্বারা সম্পাদিত কয়েকটি অপ্টিমাইজেশন অনুসরণ করে:

  • ...

  • একটি যোগদানের প্রতিটি টেবিলের জন্য, টেবিলের জন্য দ্রুত WHERE মূল্যায়ন পেতে এবং যত তাড়াতাড়ি সম্ভব সারিগুলি এড়িয়ে যাওয়ার জন্য একটি সহজ WHERE তৈরি করা হয় ।

  • প্রতিটি টেবিল সূচক জিজ্ঞাসিত, এবং সেরা সূচকটি ব্যবহৃত হয় যদি না অপ্টিমাইজারটি বিশ্বাস করে না যে এটি কোনও টেবিল স্ক্যান ব্যবহার করা আরও দক্ষ । একসময়, সেরা সূচকটি টেবিলের 30% এরও বেশি ছড়িয়ে পড়ে কিনা তার ভিত্তিতে একটি স্ক্যান ব্যবহার করা হত, তবে একটি নির্দিষ্ট শতাংশ আর সূচক বা স্ক্যান ব্যবহারের মধ্যে পছন্দ নির্ধারণ করে না। অপ্টিমাইজারটি এখন আরও জটিল এবং এটির হিসাবের ভিত্তি যেমন টেবিলের আকার, সারিগুলির সংখ্যা এবং I / O ব্লক আকারের উপর নির্ভর করে esti

এই পদ্ধতিতে কোয়েরি অপ্টিমাইজারের পক্ষে HOW- অর্ডার বাদ দেওয়ার পক্ষে যুক্তিযুক্ত আমরা কোয়েরিতে কলামগুলি ব্যবহার করেছি (কেবলমাত্র মাইএসকিউএল নয় এসকিউএল একটি ঘোষণামূলক ভাষা এবং আমরা কীভাবে চাই না তা অবশ্যই করতে হবে) must

তবে আমি এখনও কোয়েরিতে একটি সংমিশ্রিত কলের কলামগুলির জন্য একই ধরণের পছন্দ করতে চাই তবে এটি কখনও কখনও অনিবার্য হয় যেমন আমরা যখন ওআরএম বা অ্যাক্টিভেকর্ড ব্যবহার করি তখন yii2 এর মতো কিছু ফ্রেমওয়ার্কে, সম্পর্কের মানদণ্ডটি কাস্টমাইজ করে শেষের দিকে যুক্ত করা হবে একটি "অন" শর্ত তবে আমাদের এখনও একটি অ্যাপ্লিকেশনের বিভিন্ন অংশে কোয়েরি বিল্ডারদের সক্ষমতা প্রয়োজন।


-2

যে কোনও ক্ষেত্র যা আপনার WHEE / HAVING ধারাগুলিতে ব্যবহৃত হয় এবং উচ্চতর নির্বাচনীতা থাকে (অনন্য মানের সংখ্যা / রেকর্ডের মোট সংখ্যা> 10% ~ 20%) অবশ্যই ইনডেক্স করা উচিত।

সুতরাং, আপনার ASI_EVENT_TIMEকলামে যদি অনেকগুলি সম্ভাব্য মান থাকে তবে প্রথমে সেগুলি সূচী করুন। তারপরে @ টাইপকিউব যেমন বলেছিলেন, সেগুলি পুনরায় সাজানোর চেষ্টা করুন এবং আপনাকে কী ব্যাখ্যা দেয় তা দেখুন। সব একই কাছাকাছি হওয়া উচিত।

অতিরিক্তভাবে, আপনার সূচীকরণ এসকিউএল লাইক ফিল্টারগুলি দেখুন । যদিও এটির জন্য আপনার জবাব দরকার তা নয় তবে আপনি কীভাবে সূচকটির অধীনে সূচীকরণ কাজ করেন সে সম্পর্কে আপনি শিখবেন।

* সম্পাদনা করুন: ইনডেক্সিং সম্পর্কে আরও জানতে মন্তব্যগুলিতে নীচে প্রদত্ত লিঙ্কগুলি দেখুন।


8
-1 প্রতিটি কলামের সূচীকরণ সেরা অনুশীলন নয়। প্রতিটি সূচি আপনাকে একাধিক উপায়ে ব্যয় করে। নিশ্চিত হয়ে নিন যে আপনি ভাল সূচকগুলি বেছে নিয়েছেন, যা সাধারণত একাধিক কলামযুক্ত থাকে, সাধারণত নির্বাচিততা এবং ব্যবহৃত ফ্রিকোয়েন্সি অনুসারে। এটি এসকিউএল সার্ভারের স্যালেন্টেড হতে পারে তবে সূচির তথ্যটি এখনও বৈধ: sqlskills.com/BLOGS/KIMBERLY/post/…
এরিক হামফ্রে - লটশেল্প

@ এরিক হামফ্রে +1 ব্যাখ্যার জন্য এবং কিম্বার্লির সাইটের লিঙ্কটির জন্য।
ম্যাট এম

আপনি ভুল, কলামে সূচী থাকা কখনও কখনও আপনার নির্বাচিত প্রশ্নের উপর আপনার পারফরম্যান্সকে আঘাত করে: mysqlperformanceblog.com/2007/08/28/… । আপনার থাম্বের নিয়ম ব্যবহার করা উচিত নয়: কখনও কখনও এটি কার্যকর হয়, কখনও কখনও তা হয় না।
সুমার

ঠিক আছে, আমি একমত। যাইহোক, মান নির্বাচনযোগ্যতা কম ক্ষেত্রে এটি বৈধ। প্যাট্রিক (এই প্রশ্ন লেখক) যে ডেটা টাইপ ব্যবহার করেন তা বিবেচনা করে, যা DATETIME, ইনডেক্স করার প্রস্তাব দেওয়া হয়। সাধারণত যখন এই ক্ষেত্রটি কেবল বেশ কয়েকটি সম্ভাব্য তারিখ ব্যবহার করে তখন কোনও বিজোড় পরিস্থিতি না থাকলে সাধারণত এই ধরণের ক্ষেত্রের মানগুলির একটি বিশাল সেট থাকে। * আমি আরও পরিষ্কার এবং বৈধ বিবৃতি দেওয়ার জন্য আমার উত্তরটি সম্পাদনা করব।
আই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.