ठीक है यह पता चला है कि यह समस्या सिर्फ एक टेबल बनाने, इसे अनुक्रमित करने और समस्या को भूल जाने से कहीं अधिक थी :) यहां मैंने वही किया है जो किसी और को एक ही समस्या का सामना करना पड़ता है (मैंने आईपी पते का एक उदाहरण इस्तेमाल किया है लेकिन यह अन्य के लिए काम करता है डेटा प्रकार भी):
समस्या:आपकी तालिका में लाखों प्रविष्टियां हैं और आपको वास्तव में तेजी से एक अनुक्रमणिका जोड़ने की आवश्यकता है
यूजकेस: लुकअप तालिका में लाखों IP पतों को संग्रहीत करने पर विचार करें। IP पतों को जोड़ना कोई बड़ी समस्या नहीं होनी चाहिए लेकिन उन पर एक इंडेक्स बनाने में 14 घंटे से अधिक समय लगता है।
समाधान :MySQL's Partitionin का उपयोग करके अपनी तालिका को विभाजित करें जी रणनीति
मामला #1:जब आपकी इच्छित तालिका अभी तक नहीं बनी है
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
मामला #2:जब आपकी इच्छित तालिका पहले ही बन चुकी हो। ऐसा करने के लिए वैकल्पिक तालिका का उपयोग करने का एक तरीका प्रतीत होता है लेकिन मुझे अभी तक इसके लिए उचित समाधान नहीं मिला है। इसके बजाय, थोड़ा अक्षम समाधान है:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
इस तालिका में अपने आईपी पते डालें। और फिर विभाजन के साथ वास्तविक तालिका बनाएं:
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
और फिर अंत में
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
और यह रहा... नई टेबल पर अनुक्रमणित करने में मुझे 1GB RAM वाली 3.2GHz मशीन पर लगभग 2 घंटे लगे :) आशा है कि यह मदद करेगा।