আমার মোটামুটি ব্যস্ত 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)
email
আনইনডেক্স করা হয়, তবে উভয় DELETE
এবং SELECT
সমানভাবে ধীর হওয়া উচিত। অথবা: আপনি বলছেন যে টেবিলটি ভারীভাবে জিজ্ঞাসা করা হয়েছে। আপনি যখন প্রথম চেষ্টা করেছিলেন তখন DELETE
সেই সারিগুলিতে অন্য কেউ সত্যই দীর্ঘ লেনদেন চালাচ্ছিলেন ...
DELETE FROM ThreadNotification2 WHERE email='invalid address';
সম্ভবত অন্য একটি ব্যাখ্যাও সাহায্য করবে ...
EXPLAIN DELETE FROM....
তা কার্যকর হবে না। আমি যা জানি তা থেকে এটি কেবল SELECT
এস তে কাজ করে ।
SHOW CREATE TABLE
এবংEXPLAIN...
খুব সম্ভবত একটিও।