কেন নির্বাচন থেকে এত ধীর গতি হয়, তারপরে আইডি দ্বারা মুছে ফেলা হয়?


12

আমার মোটামুটি ব্যস্ত InnoDB টেবিল রয়েছে (200,000 সারি, আমি প্রতি সেকেন্ডে দশগুলি প্রশ্নের মতো অনুমান করি)। ত্রুটির কারণে আমি তাদের মধ্যে 14 টি সারি (একই) অবৈধ ইমেল ঠিকানা পেয়েছি এবং সেগুলি মুছতে চাইছি।

আমি DELETE FROM table WHERE email='invalid address'প্রায় 50 সেকেন্ড পরে কেবল চেষ্টা করেছিলাম এবং "লক ওয়েট টাইমআউট অতিক্রম করে" পেয়েছি। এটি মারাত্মক আশ্চর্যজনক নয়, যেহেতু সারি কলামটি সূচিযুক্ত নয়।

যাইহোক, আমি তখন করেছি SELECT id FROM table WHERE email='invalid address'এবং এটিতে 1.25 সেকেন্ড সময় লেগেছে। চলমান DELETE FROM table WHERE id in (...), SELECT ফলাফল থেকে আইডিগুলি অনুলিপি-করা, 0.02 সেকেন্ড সময় নিয়েছে।

কি হচ্ছে? কেউ কি ব্যাখ্যা করতে পারে যে শর্তটি মোছার কারণটি এতটাই ধীর হয় যে এটি বার হয়ে যায়, তবে নির্বাচন এবং তারপরে আইডি দিয়ে মুছে ফেলা এত দ্রুত?

ধন্যবাদ।

সম্পাদনা: অনুরোধ করে, আমি টেবিলের কাঠামোর পাশাপাশি কিছু explainফলাফল পোস্ট করেছি। আমার এই বিষয়টিও লক্ষ্য করা উচিত যে এই টেবিলটি উল্লেখ করে কোনও বিদেশী কী নেই।

যাইহোক, পরিস্থিতিটি আমার কাছে সোজাসুজি মনে হচ্ছে: আমার একটি আনইনডেক্স ক্ষেত্র রয়েছে যার বিরুদ্ধে আমি নির্বাচন করছি। এর জন্য পুরো টেবিলটি স্ক্যান করা প্রয়োজন, তবে এটি ভয়ঙ্করভাবে বড় নয়। idপ্রাথমিক কী, তাই আইডি দ্বারা মুছে ফেলা খুব দ্রুত, এটি হওয়া উচিত।

mysql> show create table ThreadNotification2 \G
*************************** 1. row ***************************
       Table: ThreadNotification2
Create Table: CREATE TABLE `ThreadNotification2` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `alertId` bigint(20) DEFAULT NULL,
  `day` int(11) NOT NULL,
  `frequency` int(11) DEFAULT NULL,
  `hour` int(11) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `highlightedTitle` longtext,
  `newReplies` bit(1) NOT NULL,
  `numReplies` int(11) NOT NULL,
  `postUrl` longtext,
  `sendTime` datetime DEFAULT NULL,
  `sent` bit(1) NOT NULL,
  `snippet` longtext,
  `label_id` bigint(20) DEFAULT NULL,
  `organization_id` bigint(20) DEFAULT NULL,
  `threadEntity_hash` varchar(255) DEFAULT NULL,
  `user_uid` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK3991E9D279251FE` (`organization_id`),
  KEY `FK3991E9D35FC0C96` (`label_id`),
  KEY `FK3991E9D3FFC22CB` (`user_uid`),
  KEY `FK3991E9D5376B351` (`threadEntity_hash`),
  KEY `scheduleSentReplies` (`day`,`frequency`,`hour`,`sent`,`numReplies`),
  KEY `sendTime` (`sendTime`),
  CONSTRAINT `FK3991E9D279251FE` FOREIGN KEY (`organization_id`) REFERENCES `Organization` (`id`),
  CONSTRAINT `FK3991E9D35FC0C96` FOREIGN KEY (`label_id`) REFERENCES `Label` (`id`),
  CONSTRAINT `FK3991E9D3FFC22CB` FOREIGN KEY (`user_uid`) REFERENCES `User` (`uid`),
  CONSTRAINT `FK3991E9D5376B351` FOREIGN KEY (`threadEntity_hash`) REFERENCES `ThreadEntity` (`hash`)
) ENGINE=InnoDB AUTO_INCREMENT=4461945 DEFAULT CHARSET=utf8
1 row in set (0.08 sec)

mysql> explain SELECT * FROM ThreadNotification2 WHERE email='invalid address';
+----+-------------+---------------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table               | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+---------------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | ThreadNotification2 | ALL  | NULL          | NULL | NULL    | NULL | 197414 | Using where |
+----+-------------+---------------------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.03 sec)


mysql> explain select * from ThreadNotification2 where id in (3940042,3940237,3941132,3941255,3941362,3942535,3943064,3944134,3944228,3948122,3953081,3957876,3963849,3966951);
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table               | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | ThreadNotification2 | range | PRIMARY       | PRIMARY | 8       | NULL |   14 | Using where |
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)



mysql> delete from ThreadNotification2 where email='invalid address';
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> select id from ThreadNotification2 where email='invalid address';
+---------+
| id      |
+---------+
| 3940042 |
| 3940237 |
| 3941132 |
| 3941255 |
| 3941362 |
| 3942535 |
| 3943064 |
| 3944134 |
| 3944228 |
| 3948122 |
| 3953081 |
| 3957876 |
| 3963849 |
| 3966951 |
+---------+
14 rows in set (1.25 sec)

mysql> delete from ThreadNotification2 where id in (3940042,3940237,3941132,3941255,3941362,3942535,3943064,3944134,3944228,3948122,3953081,3957876,3963849,3966951);
Query OK, 14 rows affected (0.02 sec)

2
আমার ধারণা আপনার অবশ্যই অবশ্যই একটি পোস্ট করতে হবে SHOW CREATE TABLEএবং EXPLAIN...খুব সম্ভবত একটিও।
রাদু মুর্জিয়া

@ সোবালান সত্যই? এটি এমন একটি সাধারণ দৃশ্যের মতো বলে মনে হচ্ছে। আমি প্রশ্ন আপডেট।
itadok

হ্যাঁ তবে .... আপনি প্রথম স্থানে ছিলেন। যদি ক্ষেত্রটি emailআনইনডেক্স করা হয়, তবে উভয় DELETEএবং SELECTসমানভাবে ধীর হওয়া উচিত। অথবা: আপনি বলছেন যে টেবিলটি ভারীভাবে জিজ্ঞাসা করা হয়েছে। আপনি যখন প্রথম চেষ্টা করেছিলেন তখন DELETEসেই সারিগুলিতে অন্য কেউ সত্যই দীর্ঘ লেনদেন চালাচ্ছিলেন ...
রাদু মুর্জিয়া

DELETE FROM ThreadNotification2 WHERE email='invalid address';সম্ভবত অন্য একটি ব্যাখ্যাও সাহায্য করবে ...
পিক্সনসেপশন

@pconcepcion আপনি লিখলে EXPLAIN DELETE FROM....তা কার্যকর হবে না। আমি যা জানি তা থেকে এটি কেবল SELECTএস তে কাজ করে ।
রাদু মুর্জিয়া

উত্তর:


6

যদি ক্ষেত্রটি emailআনইনডেক্স করা হয়, তবে উভয় DELETEএবং SELECTসমানভাবে ধীর হওয়া উচিত।

আমি কেবলমাত্র সম্ভাবনাগুলিই ভাবতে পারি: আপনি যে টেবিলটি খুব বেশি অ্যাক্সেস করেছেন তা বলে। আপনি যখন এটি কার্যকর করার চেষ্টা করছেন তখন অন্য কেউ খুব দীর্ঘ লেনদেন চালিয়েছিল (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে সেই নির্দিষ্ট সারিগুলিকে জড়িত) DELETE

আমি মনে করি সম্ভবত আপনার সেখানে কিছু বিদ্রূপ সারি sertোকানো উচিত এবং সেগুলি মোছার চেষ্টা করা উচিত। এটি 2 বা 3 বার করুন। এর সময়কালে যদি বড় পার্থক্য থাকে DELETEতবে ডিবি লোড সম্ভবত এটির কারণ।

পিএস: কেবল তখনই করুন যদি লোকেরা এই মক সারিগুলিতে বিরক্ত না হয়: ডি।


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