মাইএসকিউএল: মুছে দিন ... যেখানে (ইন) বনাম মুছে দিন..ফর্ম..জয়েন, এবং সাবলেট সহ মুছে ফেলা টেবিলগুলি


9

দাবি অস্বীকার: দয়া করে ডাটাবেস ইন্টার্নাল সম্পর্কে আমার জ্ঞানের অভাবটি ক্ষমা করুন। এখানে এটা যায়:

আমরা একটি অ্যাপ্লিকেশন চালিত করি (আমাদের দ্বারা লিখিত হয় না) যা ডাটাবেসে পর্যায়ক্রমিক ক্লিনআপ জবটিতে একটি বড় পারফরম্যান্স সমস্যা আছে। ক্যোয়ারীটি এমন দেখাচ্ছে:

delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in (
       select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY
       where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1");

সোজা এগিয়ে, পড়তে সহজ এবং স্ট্যান্ডার্ড এসকিউএল। কিন্তু দুর্ভাগ্যক্রমে খুব ধীর। ক্যোয়ারির ব্যাখ্যা দেওয়ার মাধ্যমে দেখা যায় যে বিদ্যমান সূচকটি VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_IDব্যবহৃত হয়নি:

mysql> explain delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in (
    ->        select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY
    ->        where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1");
| id | select_type        | table                 | type            | possible_keys                    | key     | key_len | ref  | rows    | Extra       |
+----+--------------------+-----------------------+-----------------+----------------------------------+---------+---------+------+---------+-------------+
|  1 | PRIMARY            | VARIABLE_SUBSTITUTION | ALL             | NULL                             | NULL    | NULL    | NULL | 7300039 | Using where |
|  2 | DEPENDENT SUBQUERY | BUILDRESULTSUMMARY    | unique_subquery | PRIMARY,key_number_results_index | PRIMARY | 8       | func |       1 | Using where |

এটি এটিকে খুব ধীর করে তোলে (120 সেকেন্ড এবং আরও বেশি)। এগুলি ছাড়াও, এটি এমন কিউরিগুলি ব্লক করে বলে মনে হচ্ছে যা সন্নিবেশ করানোর চেষ্টা করে BUILDRESULTSUMMARY, এর থেকে আউটপুট show engine innodb status:

---TRANSACTION 68603695, ACTIVE 157 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 127964, OS thread handle 0x7facd0670700, query id 956555826 localhost 127.0.0.1 bamboosrv updating
update BUILDRESULTSUMMARY set CREATED_DATE='2015-06-18 09:22:05', UPDATED_DATE='2015-06-18 09:22:32', BUILD_KEY='BLA-RELEASE1-JOB1', BUILD_NUMBER=8, BUILD_STATE='Unknown', LIFE_CYCLE_STATE='InProgress', BUILD_DATE='2015-06-18 09:22:31.792', BUILD_CANCELLED_DATE=null, BUILD_COMPLETED_DATE='2015-06-18 09:52:02.483', DURATION=1770691, PROCESSING_DURATION=1770691, TIME_TO_FIX=null, TRIGGER_REASON='com.atlassian.bamboo.plugin.system.triggerReason:CodeChangedTriggerReason', DELTA_STATE=null, BUILD_AGENT_ID=199688199, STAGERESULT_ID=230943366, RESTART_COUNT=0, QUEUE_TIME='2015-06-18 09:22:04.52
------- TRX HAS BEEN WAITING 157 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 38 page no 30140 n bits 112 index `PRIMARY` of table `bamboong`.`BUILDRESULTSUMMARY` trx id 68603695 lock_mode X locks rec but not gap waiting
------------------
---TRANSACTION 68594818, ACTIVE 378 sec starting index read
mysql tables in use 2, locked 2
646590 lock struct(s), heap size 63993384, 3775190 row lock(s), undo log entries 117
MySQL thread id 127845, OS thread handle 0x7facc6bf8700, query id 956652201 localhost 127.0.0.1 bamboosrv preparing
delete from VARIABLE_SUBSTITUTION  where BUILDRESULTSUMMARY_ID in   (select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY where BUILDRESULTSUMMARY.BUILD_KEY = 'BLA-BLUBB10-SON')

এটি সিস্টেমকে ধীর করে দেয় এবং আমাদের বৃদ্ধি করতে বাধ্য করেছিল innodb_lock_wait_timeout

আমরা মাইএসকিউএল চালানোর সাথে সাথে, "যোগ থেকে মুছুন" ব্যবহার করতে মুছুন কোয়েরিটি আবার লিখেছি:

delete VARIABLE_SUBSTITUTION from VARIABLE_SUBSTITUTION join BUILDRESULTSUMMARY
   on VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_ID = BUILDRESULTSUMMARY.BUILDRESULTSUMMARY_ID
   where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1";

এটি পড়ার চেয়ে সামান্য কম সহজ, দুর্ভাগ্যক্রমে কোনও স্ট্যান্ডার্ড এসকিউএল (যতদূর আমি এটি জানতে পেরেছি), তবে এটি সূচকটি ব্যবহার করে অনেক দ্রুত (0.02 সেকেন্ড বা তার বেশি):

mysql> explain delete VARIABLE_SUBSTITUTION from VARIABLE_SUBSTITUTION join BUILDRESULTSUMMARY
    ->    on VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_ID = BUILDRESULTSUMMARY.BUILDRESULTSUMMARY_ID
    ->    where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1";
| id | select_type | table                 | type | possible_keys                    | key                      | key_len | ref                                                    | rows | Extra                    |
+----+-------------+-----------------------+------+----------------------------------+--------------------------+---------+--------------------------------------------------------+------+--------------------------+
|  1 | SIMPLE      | BUILDRESULTSUMMARY    | ref  | PRIMARY,key_number_results_index | key_number_results_index | 768     | const                                                  |    1 | Using where; Using index |
|  1 | SIMPLE      | VARIABLE_SUBSTITUTION | ref  | var_subst_result_idx             | var_subst_result_idx     | 8       | bamboo_latest.BUILDRESULTSUMMARY.BUILDRESULTSUMMARY_ID |   26 | NULL                     |

অতিরিক্ত তথ্য:

mysql> SHOW CREATE TABLE VARIABLE_SUBSTITUTION;
| Table                 | Create Table |
| VARIABLE_SUBSTITUTION | CREATE TABLE `VARIABLE_SUBSTITUTION` (
  `VARIABLE_SUBSTITUTION_ID` bigint(20) NOT NULL,
  `VARIABLE_KEY` varchar(255) COLLATE utf8_bin NOT NULL,
  `VARIABLE_VALUE` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
  `VARIABLE_TYPE` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `BUILDRESULTSUMMARY_ID` bigint(20) NOT NULL,
  PRIMARY KEY (`VARIABLE_SUBSTITUTION_ID`),
  KEY `var_subst_result_idx` (`BUILDRESULTSUMMARY_ID`),
  KEY `var_subst_type_idx` (`VARIABLE_TYPE`),
  CONSTRAINT `FK684A7BE0A958B29F` FOREIGN KEY (`BUILDRESULTSUMMARY_ID`) REFERENCES `BUILDRESULTSUMMARY` (`BUILDRESULTSUMMARY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

mysql> SHOW CREATE TABLE BUILDRESULTSUMMARY;
| Table              | Create Table |
| BUILDRESULTSUMMARY | CREATE TABLE `BUILDRESULTSUMMARY` (
  `BUILDRESULTSUMMARY_ID` bigint(20) NOT NULL,
....
  `SKIPPED_TEST_COUNT` int(11) DEFAULT NULL,
  PRIMARY KEY (`BUILDRESULTSUMMARY_ID`),
  KEY `FK26506D3B9E6537B` (`CHAIN_RESULT`),
  KEY `FK26506D3BCCACF65` (`MERGERESULT_ID`),
  KEY `key_number_delta_state` (`DELTA_STATE`),
  KEY `brs_build_state_idx` (`BUILD_STATE`),
  KEY `brs_life_cycle_state_idx` (`LIFE_CYCLE_STATE`),
  KEY `brs_deletion_idx` (`MARKED_FOR_DELETION`),
  KEY `brs_stage_result_id_idx` (`STAGERESULT_ID`),
  KEY `key_number_results_index` (`BUILD_KEY`,`BUILD_NUMBER`),
  KEY `brs_agent_idx` (`BUILD_AGENT_ID`),
  KEY `rs_ctx_baseline_idx` (`VARIABLE_CONTEXT_BASELINE_ID`),
  KEY `brs_chain_result_summary_idx` (`CHAIN_RESULT`),
  KEY `brs_log_size_idx` (`LOG_SIZE`),
  CONSTRAINT `FK26506D3B9E6537B` FOREIGN KEY (`CHAIN_RESULT`) REFERENCES `BUILDRESULTSUMMARY` (`BUILDRESULTSUMMARY_ID`),
  CONSTRAINT `FK26506D3BCCACF65` FOREIGN KEY (`MERGERESULT_ID`) REFERENCES `MERGE_RESULT` (`MERGERESULT_ID`),
  CONSTRAINT `FK26506D3BCEDEEF5F` FOREIGN KEY (`STAGERESULT_ID`) REFERENCES `CHAIN_STAGE_RESULT` (`STAGERESULT_ID`),
  CONSTRAINT `FK26506D3BE3B5B062` FOREIGN KEY (`VARIABLE_CONTEXT_BASELINE_ID`) REFERENCES `VARIABLE_CONTEXT_BASELINE` (`VARIABLE_CONTEXT_BASELINE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

(কিছু জিনিস বাদ দেওয়া হয়েছে, এটি বেশ প্রশস্ত টেবিল)।

সুতরাং আমি এই সম্পর্কে কিছু প্রশ্ন আছে:

  • যোগদানের সংস্করণটি ব্যবহার করার সময় কোয়েরি অপ্টিমাইজারটি যখন সাবকোয়ারি সংস্করণটি মুছে ফেলার জন্য মুছে ফেলার জন্য সূচকটি ব্যবহার করতে সক্ষম হয় না কেন?
  • সূচকটি ব্যবহার করে চালাকি করার কোনও (আদর্শ মান অনুসারে) উপায় আছে কি? অথবা
  • একটি লেখার একটি পোর্টেবল উপায় আছে delete from join? অ্যাপ্লিকেশনটি জেডিবিসি এবং হাইবারনেটের মাধ্যমে ব্যবহৃত পোস্টগ্রাইএসকিউএল, মাইএসকিউএল, ওরাকল এবং মাইক্রোসফ্ট এসকিউএল সার্ভার সমর্থন করে।
  • VARIABLE_SUBSTITUTIONসন্নিবেশগুলিতে ব্লক করা থেকে মুছে ফেলা হবে কেন BUILDRESULTSUMMARY, যা কেবলমাত্র সাবলেটতে ব্যবহৃত হয়?

পারকোনা সার্ভার 5.6.24-72.2-1.jessie resp 5.6.24-72.2-1.wheezy (পরীক্ষার সিস্টেমে)।
0x89

হ্যাঁ, পুরো ডাটাবেস ইনোডাব ব্যবহার করে।
0x89

সুতরাং এটি 5.5 অপ্টিমাইজার উন্নত তেমন মনোযোগ পায় নি বলে মনে হয়। আপনি 5.7 জন্য অপেক্ষা করতে হবে (কিন্তু যদি আপনি করতে পারেন MariaDB চেষ্টা করবেন তাদের অপটিমাইজার উন্নতি তাদের 5.3 এবং 5.5 সংস্করণে ফিরে সম্পন্ন করা হয়।।)
ypercubeᵀᴹ

ডায়াল্ট সাবকিউরিটি অপ্টিমাইজড বা ৫.7 করার জন্য কোনও হাইপারইপ নেই আফ্রিক्यूब আফাইক মুছে ফেলা নির্বাচন থেকে পৃথকভাবে অনুকূলিতকরণ।
মরগান টকার

উত্তর:


7
  • যোগদানের সংস্করণটি ব্যবহার করার সময় কোয়েরি অপ্টিমাইজারটি যখন সাবকোয়ারি সংস্করণটি মুছে ফেলার জন্য মুছে ফেলার জন্য সূচকটি ব্যবহার করতে সক্ষম হয় না কেন?

কারণ অপটিমাইজারটি / সে ক্ষেত্রে কিছুটা বোবা ছিল। শুধু জন্য DELETEএবং UPDATEকিন্তু SELECTবিবৃতি পাশাপাশি, ভালো কিছু WHERE column IN (SELECT ...)সম্পূর্ণরূপে অপ্টিমাইজ করা হয় নি। এক্সিকিউশন প্ল্যানটি সাধারণত বাহ্য সারণীর প্রতিটি সারি ( VARIABLE_SUBSTITUTIONএই ক্ষেত্রে) এর জন্য সাবকিউরি চালাতে জড়িত । যদি টেবিলটি ছোট হয় তবে সবকিছু ঠিক আছে। এটি যদি বড় হয় তবে কোনও আশা নেই। এমনকি পুরানো সংস্করণগুলিতে, উপ-সাবকোয়ারি INসহ একটি INউপজীব্য EXPLAINযুগে যুগে চলার উপক্রমও করে তোলে ।

আপনি কী করতে পারেন - আপনি যদি এই ক্যোয়ারীটি রাখতে চান - তবে সর্বশেষতম সংস্করণগুলি ব্যবহার করা যা বেশ কয়েকটি অপ্টিমাইজেশন প্রয়োগ করেছে এবং আবার পরীক্ষা করেছে। সর্বশেষ সংস্করণগুলির অর্থ: মাইএসকিউএল 5.6 (এবং বিটা থেকে বেরিয়ে আসার পরে 5.7) এবং মারিয়াডিবি 5.5 / 10.0

(আপডেট) আপনি ইতিমধ্যে 5.6 ব্যবহার করেছেন যার অপ্টিমাইজেশন উন্নতি রয়েছে এবং এটি প্রাসঙ্গিক: আধা-যোগদানের রূপান্তরগুলির সাথে সাবকিউরিজগুলি অনুকূল করা
আমি (BUILD_KEY)একা একটি সূচক যুক্ত করার পরামর্শ দিই । এখানে একটি যৌগিক রয়েছে তবে এটি এই প্রশ্নের জন্য খুব কার্যকর নয়।

  • সূচকটি ব্যবহার করে চালাকি করার কোনও (আদর্শ মান অনুসারে) উপায় আছে কি?

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

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

পূর্ববর্তী প্রশ্ন হিসাবে একই উত্তর।

  • কেন কেবল VARIABLE_SUBSTITUTION থেকে মুছে ফেলা আবশ্যকতাগুলিকে বিল্ড্রেইলসসএমআরইতে অন্তর্ভুক্ত করা হচ্ছে, যা কেবলমাত্র সাবটেক্টে ব্যবহৃত হয়?

১০০% নিশ্চিত নয় তবে আমি মনে করি এটি একাধিকবার সাবকিউরি চালানো এবং টেবিলটিতে কী ধরণের লক নিয়ে চলেছে তা করতে হবে।


ইনানোডবি_স্ট্যাটাসের (মুছে ফেলা লেনদেনের) "3775190 সারি লক (গুলি) অত্যন্ত পরামর্শদায়ক। তবে "মাইএসকিএল টেবিলগুলি ব্যবহার 2, লক 2" আমার কাছে খুব ভাল লাগছে না ..
0x89

2

আপনার দুটি প্রশ্নের উত্তর এখানে

  • অপ্টিমাইজার সূচকটি ব্যবহার করতে পারছে না কারণ যেখানে প্রতি সারিটির জন্য ক্লজ পরিবর্তিত হয়। অপটিমাইজারটি পাস করার পরে মুছুন স্টেটমেন্টটি এ জাতীয় কিছু দেখবে

    delete from VARIABLE_SUBSTITUTION where EXISTS (
    select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY
    where BUILDRESULTSUMMARY.BUILD_KEY = BUILDRESULTSUMMARY_ID AND BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1");

তবে আপনি যখন যোগদান করবেন, সার্ভার মুছে ফেলা সজ্জিত সারিগুলি সনাক্ত করতে সক্ষম।

  • কৌশলটি হ'ল ভেরিয়েবলটি ধরে রাখতে BUILDRESULTSUMMARY_IDএবং ক্যোয়ারির পরিবর্তে ভেরিয়েবলটি ব্যবহার করা। নোট করুন যে চলক সূচনা এবং মুছা কোয়েরি উভয়ই একটি সেশনের মধ্যে চলতে হবে। এটার মতো কিছু.

    SET @ids = (SELECT GROUP_CONCAT(BUILDRESULTSUMMARY_ID) 
            from BUILDRESULTSUMMARY where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1" ); 
    delete from VARIABLE_SUBSTITUTION where FIND_IN_SET(BUILDRESULTSUMMARY_ID,@ids) > 0;

    যদি ক্যোয়ারী অনেকগুলি আইডিস ফেরত দেয় এবং এটি কোনও মানক উপায় না হয় তবে আপনি এটির সাথে সমস্যার মুখোমুখি হতে পারেন। এটি ঠিক একটি কর্মক্ষেত্র।

    এবং আপনার অন্য দুটি প্রশ্নের উত্তর আমার কাছে নেই :)


ঠিক আছে, আপনি আমার বক্তব্য মিস করেছেন। আমি মনে করি তুমি কি বিবেচনা না উভয় VARIABLE_SUBSTITUTION এবং BUILDRESULTSUMMARY তাই এটি হওয়া উচিত BUILDRESULTSUMMARY_ID নামে, একটি কলাম আছে হল: 'VARIABLE_SUBSTITUTION যেখানে বিদ্যমান থেকে মুছে ফেলে (BUILDRESULTSUMMARY থেকে BUILDRESULTSUMMARY_ID নির্বাচন যেখানে BUILDRESULTSUMMARY.BUILDRESULTSUMMARY_ID = VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_ID এবং BUILDRESULTSUMMARY.BUILD_KEY = "BAM -1 "); '। তারপরে এটি বোধগম্য হয় এবং উভয় প্রশ্নের একই কাজ হয়।
0x89

1
হ্যাঁ আমি কেবল বাইরের টেবিলের একটি উল্লেখ অনুপস্থিত। কিন্তু সেটা আসল কথা না। এটি অপ্টিমাইজারে কীভাবে চিকিত্সা করা হবে তার একটি চিত্রণ।
মাসউদ

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