जब से तुम एक इनाम रखा है, मैं अपनी मुश्किल जीता रहस्य साझा करेंगे ...
सामान्य तौर पर, सभी एसक्यूएल जिन्हें मैंने आज उप-प्रश्नों का उपयोग करके आवश्यक किया था। Oracle डेटाबेस की दुनिया से आने के बाद, मैंने जो चीजें दीं, वे MySQL के साथ काम नहीं कर रही थीं। और MySQL ट्यूनिंग पर मेरा पढ़ना मुझे निष्कर्ष निकालता है कि प्रश्नों के अनुकूलन के मामले में MySQL Oracle के पीछे है।
जबकि अधिकांश बी 2 सी अनुप्रयोगों के लिए आवश्यक सरल प्रश्न MySQL के लिए अच्छी तरह से काम कर सकते हैं, अधिकांश रिपोर्टिंग रिपोर्टिंग प्रकार जो इंटेलिजेंस रिपोर्टिंग के लिए आवश्यक थे, के लिए एक उचित बिट की योजना बनाने और MySQL को तेजी से निष्पादित करने के लिए MySQL को निर्देशित करने के लिए फिर से व्यवस्थित करने की आवश्यकता प्रतीत होती है।
शासन प्रबंध:
max_connections
समवर्ती कनेक्शन की संख्या है। डिफ़ॉल्ट मान 100 कनेक्शन है (5.0 के बाद से 151) - बहुत छोटा।
ध्यान दें:
कनेक्शन मेमोरी लेते हैं और आपका OS बहुत सारे कनेक्शनों को संभालने में सक्षम नहीं हो सकता है।
लिनक्स / x86 के लिए MySQL बायनेरी आपको 4096 तक समवर्ती कनेक्शन की अनुमति देता है, लेकिन स्व संकलित बायनेरिज़ में अक्सर एक सीमा कम होती है।
अपनी खुली तालिकाओं और समवर्ती कनेक्शनों की संख्या के मिलान के लिए table_cache सेट करें। Open_tables मान देखें और यदि यह जल्दी से बढ़ रहा है तो आपको इसका आकार बढ़ाने की आवश्यकता होगी।
ध्यान दें:
पिछले 2 मापदंडों को बहुत सारी खुली फ़ाइलों की आवश्यकता हो सकती है। 20 + max_connections + table_cache * 2 जो आपके लिए आवश्यक है उसके लिए एक अच्छा अनुमान है। लिनक्स पर MySQL में एक open_file_limit विकल्प है, इस सीमा को सेट करें।
यदि आपके पास जटिल प्रश्न हैं Sort_buffer_size और tmp_table_size बहुत महत्वपूर्ण होने की संभावना है। मान क्वेरी जटिलता और उपलब्ध संसाधनों पर निर्भर करेगा, लेकिन 4Mb और 32Mb, क्रमशः शुरुआती बिंदुओं की सिफारिश की जाती है।
नोट: ये "प्रति कनेक्शन" मान हैं, read_buffer_size, read_rnd_buffer_size और कुछ अन्य लोगों के बीच, जिसका अर्थ है कि प्रत्येक कनेक्शन के लिए इस मान की आवश्यकता हो सकती है। इसलिए, इन मापदंडों को सेट करते समय अपने लोड और उपलब्ध संसाधन पर विचार करें। उदाहरण के लिए Sort_buffer_size केवल तभी आवंटित किया जाता है जब MySQL को एक सॉर्ट करने की आवश्यकता होती है। नोट: ध्यान रहे कि मेमोरी से बाहर न भागें।
यदि आपके पास कई कनेक्ट स्थापित हैं (यानी लगातार कनेक्शन के बिना एक वेब साइट), तो आप गैर-शून्य मान के लिए थ्रेड_cache_size सेट करके प्रदर्शन में सुधार कर सकते हैं। 16 के साथ शुरू करने के लिए अच्छा मूल्य है। मूल्य बढ़ाएं जब तक कि आपके थ्रेड्स_क्रिएटेड बहुत जल्दी नहीं बढ़ते हैं।
प्राथमिक कुंजी:
प्रति तालिका में केवल एक AUTO_INCREMENT कॉलम हो सकता है, इसे अनुक्रमित किया जाना चाहिए, और इसमें DEFAF मान नहीं हो सकता
कुंजी आमतौर पर INDEX का पर्याय है। मुख्य विशेषता प्राथमिक कुंजी को कॉलम परिभाषा में दिए जाने पर सिर्फ कुंजी के रूप में निर्दिष्ट किया जा सकता है। यह अन्य डेटाबेस सिस्टम के साथ संगतता के लिए लागू किया गया था।
एक प्राथमिक कुंजी एक अद्वितीय सूचकांक है, जहां सभी प्रमुख कॉलमों को नॉट NULL के रूप में परिभाषित किया जाना चाहिए
यदि एक प्राथमिक कुंजी या UNIQUE इंडेक्स में केवल एक कॉलम होता है जिसमें पूर्णांक प्रकार होता है, तो आप सेलेक्ट स्टेटमेंट में कॉलम को "_rowid" के रूप में भी संदर्भित कर सकते हैं।
MySQL में, PRIMARY KEY का नाम PRIMARY है
वर्तमान में, केवल InnoDB (v5.1?) टेबल विदेशी कुंजी का समर्थन करते हैं।
आमतौर पर, आप उन सभी इंडेक्सों को बनाते हैं जिनकी आपको आवश्यकता होती है जब आप टेबल बना रहे होते हैं। किसी भी कॉलम को PRIMARY KEY, KEY, UNIQUE या INDEX के रूप में घोषित किया जाएगा।
NULL का अर्थ है "मूल्य नहीं होना"। NULL के लिए परीक्षण करने के लिए, आप अंकगणितीय तुलना ऑपरेटरों जैसे =, <, या <> का उपयोग नहीं कर सकते । इसके बजाय IS NULL और IS NULL ऑपरेटरों का उपयोग करें:
NO_AUTO_VALUE_ON_ZERO 0 के लिए ऑटो वेतन वृद्धि को दबाता है ताकि केवल NULL अगला अनुक्रम संख्या उत्पन्न करे। यह मोड उपयोगी हो सकता है यदि 0 को किसी तालिका के AUTO_INCREMENT कॉलम में संग्रहीत किया गया हो। (भंडारण 0 अनुशंसित तरीका नहीं है।)
नई पंक्तियों के लिए उपयोग किए जाने वाले AUTO_INCREMENT काउंटर का मान बदलने के लिए:
ALTER TABLE mytable AUTO_INCREMENT = value;
या INSERT_ID = मान सेट करें;
जब तक अन्यथा निर्दिष्ट नहीं किया जाता है, तब तक मूल्य इस प्रकार होगा: 1000000 या इसे इस प्रकार निर्दिष्ट करें:
...) इंजन = MyISAM डिफाल्ट चार्ट = लैटिन 1 AUTO_INCREMENT = 1
timestamps:
TIMESTAMP स्तंभों का मान संग्रहण के लिए वर्तमान समय क्षेत्र से UTC में और UTC से वर्तमान समय क्षेत्र में पुनर्प्राप्ति के लिए परिवर्तित किया जाता है।
http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
किसी तालिका में एक TIMESTAMP स्तंभ के लिए, आप वर्तमान टाइमस्टैम्प को डिफ़ॉल्ट मान और स्वतः-अद्यतन मान के रूप में असाइन कर सकते हैं।
WHERE क्लॉज़ में इन प्रकारों में से किसी एक का उपयोग करते समय देखने के लिए एक बात, WHERE datecolumn = FROM_UNIXTIME (1057941242) करना सबसे अच्छा है और न कि जहाँ UNIX_TIMESTAMP (दिनांक) = 1057941242 है। बाद वाले इंडेक्स का लाभ नहीं लेंगे उस कॉलम पर।
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
UNIX_TIMESTAMP()
FROM_UNIXTIME()
UTC_DATE()
UTC_TIME()
UTC_TIMESTAMP()
यदि आप MySQL में यूनिक्स टाइमस्टैम्प में एक डेटाइम को कनवर्ट करते हैं:
और फिर इसमें 24 घंटे जोड़ते हैं:
और फिर इसे वापस एक डेटाइम में परिवर्तित करें यह जादुई रूप से एक घंटा खो देता है!
यहाँ क्या हो रहा है। जब यूनिक्स टाइमस्टैम्प को एक डाइमटाइम में वापस परिवर्तित किया जाता है, तो समय-सीमा को ध्यान में रखा जाता है और यह सिर्फ इतना होता है कि 28 और 29 अक्टूबर 2006 के बीच हम दिन के उजाले की बचत के समय से चले गए और एक घंटा खो गए।
MySQL 4.1.3 से शुरू होकर, CURRENT_TIMESTAMP (), CURRENT_TIME (), CURRENT_DATE (), और FROM_UNIXTIME () फ़ंक्शन कनेक्शन के वर्तमान समय क्षेत्र में मान लौटाते हैं , जो time_zone सिस्टम चर के मान के रूप में उपलब्ध है। इसके अलावा, UNIX_TIMESTAMP () मानता है कि इसका तर्क वर्तमान समय क्षेत्र में एक डेटटाइम मान है।
वर्तमान समय क्षेत्र सेटिंग UTC_TIMESTAMP () या DATE, TIME, या DATETIME कॉलम जैसे मानों से प्रदर्शित मानों को प्रभावित नहीं करती है।
नोट: यदि अद्यतन किया जाता है तो केवल दिनांक समय-सारणी अपडेट करें यदि फ़ील्ड बदली गई है तो यदि कोई अद्यतन फ़ील्ड नहीं बदली जा रही है तो दिनांक समय अद्यतन नहीं है!
अतिरिक्त रूप से, पहला टाइमस्टैम्प हमेशा डिफ़ॉल्ट रूप से स्वचालित होता है, भले ही वह निर्दिष्ट न हो
जब मैं डेट्स के साथ काम करता हूं, तो मैं लगभग हमेशा जूलियन डेट बीसूएज़ डेटा गणित से अवगत कराता हूं, फिर एक ही कारण के लिए आधी रात के बाद से पूर्णांकों को जोड़ने और अधीन करने का एक साधारण मामला है। यह दुर्लभ है कि मुझे सेकंड की तुलना में बारीक बारीकता के समय पुनर्जीवन की आवश्यकता है।
इन दोनों को एक 4 बाइट पूर्णांक के रूप में संग्रहीत किया जा सकता है, और यदि अंतरिक्ष वास्तव में तंग है तो UNIX समय (सेकंड 1/1/1970 के बाद से) को एक अहस्ताक्षरित पूर्णांक के रूप में जोड़ा जा सकता है जो लगभग 2106 तक अच्छा होगा:
'मुद्राओं में सेकंड = 86400
'हस्ताक्षर किए गए पूर्णांक अधिकतम वैल = 2,147,483,647 - सेकेंड के 68 वर्ष हो सकते हैं
'अनसाइनड इंटेगर मैक्स वैल = 4,294,967,295 - 136 साल के सेकंड्स को होल्ड कर सकता है
बाइनरी प्रोटोकॉल:
MySQL 4.1 ने एक बाइनरी प्रोटोकॉल पेश किया है जो गैर-स्ट्रिंग डेटा मानों को भेजने और स्ट्रिंग प्रारूप से रूपांतरण के बिना मूल प्रारूप में वापस भेजने की अनुमति देता है। (बहुत उपयोगी)
इसके अलावा, mysql_real_query () mysql_query () से तेज है क्योंकि यह स्टेटीन स्ट्रिंग पर काम करने के लिए स्ट्रलेन () को कॉल नहीं करता है।
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
बाइनरी प्रोटोकॉल सर्वर-साइड तैयार कथनों का समर्थन करता है और देशी प्रारूप में डेटा मूल्यों के प्रसारण की अनुमति देता है। MySQL 4.1 के पहले रिलीज के दौरान बाइनरी प्रोटोकॉल में काफी सुधार हुआ।
आप यह परीक्षण करने के लिए IS_NUM () मैक्रो का उपयोग कर सकते हैं कि किसी फ़ील्ड का संख्यात्मक प्रकार है या नहीं। IS_NUM () के प्रकार का मान पास करें और फ़ील्ड के संख्यात्मक होने पर यह TRUE का मूल्यांकन करता है:
टिप्पणी करने के लिए एक बात है कि बाइनरी डेटा है सकते हैं एक नियमित रूप से क्वेरी के अंदर भेजा जा अगर आप इसे से बचने और याद MySQL की आवश्यकता है केवल कि बैकस्लैश और उद्धरण कैरेक्टर भाग निकले जा। उदाहरण के लिए एन्क्रिप्टेड / नमकीन पासवर्ड जैसे छोटे बाइनरी स्ट्रिंग्स को INSERT करना वास्तव में आसान तरीका है।
मास्टर सर्वर:
http://www.experts-exchange.com/Database/MySQL/Q_22967482.html
http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2
अनुदान की प्रतिपूर्ति । 'गुलाम_पासवर्ड' द्वारा
#Master Binary Logging Config STATEMENT causes replication
to be statement-based - default
log-bin=Mike
binlog-format=STATEMENT
server-id=1
max_binlog_size = 10M
expire_logs_days = 120
#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2
बाइनरी लॉग फ़ाइल अवश्य पढ़ें:
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/
http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html
आप RESET MASTER स्टेटमेंट के साथ सभी बाइनरी लॉग फ़ाइलों को हटा सकते हैं, या PURGE MASTER के साथ उन्हें एक सबसेट कर सकते हैं
--result-file = binlog.txt TrustedFriend-bin.000030
सामान्यीकरण:
http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html
यूडीएफ कार्य करता है
http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx
http://souptonuts.sourceforge.net/readme_mysql.htm
जानकारी का प्रकार:
http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2
http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/
एक बात का ध्यान रखें कि CHAR और VARCHAR दोनों के साथ एक मिश्रित टेबल पर, mySQL CHAR के VARCHAR में बदल जाएगा
RecNum integer_type UNULLIGNED नहीं पूर्ण AUTO_INCREMENT, प्राथमिक कुंजी (RecNum)
MySQL हमेशा मानक SQL और ISO 8601 विनिर्देशों के अनुसार, पहले वर्ष के साथ तारीखों का प्रतिनिधित्व करता है
विविध:
कुछ MySQl कार्यक्षमता को बंद करने के परिणामस्वरूप छोटी डेटा फ़ाइलें और तेज़ी से पहुंच प्राप्त होगी। उदाहरण के लिए:
-डाटाडिर डेटा डायरेक्टरी और निर्दिष्ट करेगा
-स्काइप-इनोडब इनो विकल्प को बंद कर देगा और आपको 10-20M बचाएगा
यहाँ और अधिक
http://dev.mysql.com/tech-resources/articles/mysql-c-api.html
डाउनलोड अध्याय 7 - नि: शुल्क
InnoDB ट्रांसेक्शनल है, लेकिन एक प्रदर्शन ओवरहेड है जो इसके साथ आता है। मैंने अपनी परियोजनाओं के 90% के लिए MyISAM तालिकाओं को पर्याप्त पाया है। गैर-लेन-देन-सुरक्षित टेबल (MyISAM) के अपने स्वयं के कई फायदे हैं, जो सभी के कारण होते हैं:
कोई लेनदेन ओवरहेड नहीं है:
काफी तेज
कम डिस्क स्थान आवश्यकताएँ
अपडेट करने के लिए कम मेमोरी की आवश्यकता होती है
प्रत्येक MyISAM तालिका को डिस्क पर तीन फ़ाइलों में संग्रहीत किया जाता है। फ़ाइलों में नाम होते हैं जो तालिका नाम से शुरू होते हैं और फ़ाइल प्रकार को इंगित करने के लिए एक एक्सटेंशन होता है। एक .frm फ़ाइल तालिका प्रारूप को संग्रहीत करती है। डेटा फ़ाइल में एक .MYD (MYData) एक्सटेंशन है। सूचकांक फ़ाइल में एक .MYI (MYIndex) एक्सटेंशन है।
MySQL एडमिनिस्ट्रेटर बैकअप सुविधा का उपयोग किए बिना इन फ़ाइलों को स्टोरेज लोकेशन पर कॉपी किया जा सकता है, जो समय लेने वाली है (ताकि रिस्टोर हो)
ट्रिक इन फाइल्स की एक कॉपी बना लेती है फिर टेबल को DROP कर देती है। जब आप फ़ाइलों को वापस डालते हैं तो MySQl उन्हें पहचान लेगा और टेबल ट्रैकिंग को अपडेट कर देगा।
यदि आपको बैकअप / पुनर्स्थापना चाहिए,
बैकअप को पुनर्स्थापित करना, या किसी मौजूदा डंप फ़ाइल से आयात करना प्रत्येक तालिका पर आपके द्वारा अनुक्रमित और प्राथमिक कुंजियों की संख्या के आधार पर एक लंबा समय ले सकता है। आप इस प्रक्रिया को नाटकीय रूप से अपनी मूल डंप फ़ाइल को संशोधित करके इसे आसपास के साथ गति दे सकते हैं:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your dump file ..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
पुनः लोड की गति को बढ़ाने के लिए, SQL कमांड SET AUTOCOMMIT = 0 जोड़ें; डंप फ़ाइल की शुरुआत में, और COMMIT जोड़ें; अंत तक आज्ञा।
डिफ़ॉल्ट रूप से, ऑटोकॉमिट चालू है, जिसका अर्थ है कि डंप फ़ाइल में प्रत्येक और सम्मिलित कमांड को एक अलग लेनदेन के रूप में माना जाएगा और अगले एक को शुरू करने से पहले डिस्क पर लिखा जाएगा। यदि आप इन आदेशों को नहीं जोड़ते हैं, तो एक बड़े डेटाबेस को InnoDB में पुनः लोड करने में कई घंटे लग सकते हैं ...
MySQL तालिका में एक पंक्ति का अधिकतम आकार 65,535 बाइट्स है
MySQL 5.0.3 में और VARCHAR की प्रभावी अधिकतम लंबाई = अधिकतम पंक्ति आकार (65,535 बाइट्स)
VARCHAR मान संग्रहीत नहीं किए जाते हैं। मानक एसक्यूएल के अनुरूप मूल्यों को संग्रहीत और पुनर्प्राप्त किए जाने पर ट्रेलिंग स्पेस को बनाए रखा जाता है।
MySQL में CHAR और VARCHAR मान को अनुगामी रिक्त स्थान की परवाह किए बिना तुलना की जाती है।
यदि पूरा रिकॉर्ड निश्चित आकार का है, तो CHAR का उपयोग करने से आपकी पहुंच में तेजी आएगी। यही है, यदि आप किसी भी चर आकार की वस्तु का उपयोग करते हैं, तो आप उन सभी को भी चर आकार दे सकते हैं। आप किसी तालिका में CHAR का उपयोग करके कोई गति प्राप्त नहीं करते हैं जिसमें VARCHAR भी शामिल है।
255 वर्णों की VARCHAR सीमा MySQL 5.0.3 के रूप में 65535 वर्णों तक बढ़ाई गई थी
पूर्ण-पाठ खोज केवल MyISAM तालिकाओं के लिए समर्थित हैं।
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
BLOB कॉलम में कोई वर्ण सेट नहीं है, और स्तंभ मानों में बाइट्स के संख्यात्मक मानों के आधार पर छंटनी और तुलना होती है
यदि सख्त SQL मोड सक्षम नहीं है और आप एक BLOB या TEXT कॉलम के मान को असाइन करते हैं जो कॉलम की अधिकतम लंबाई से अधिक है, तो मान को फिट करने के लिए छोटा कर दिया जाता है और एक चेतावनी उत्पन्न होती है।
उपयोगी कमांड:
सख्त मोड की जाँच करें: SELECT @@ global.sql_mode;
सख्त मोड बंद करें:
SET @@ global.sql_mode = '';
SET @@ global.sql_mode = 'MYSQL40'
या निकालें: sql-mode = "STRICT_TRANS_TABLES, ...
रंगों से दिखाएँ mytable
Virtualcolumn virtualcolumn
द्वारा mytable ORDER से अधिकतम (namecount) का चयन करें
http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id
last_insert_id ()
आपको वर्तमान थ्रेड अधिकतम (pkcolname) में सम्मिलित अंतिम पंक्ति का PK मिलता है, जो आपको अंतिम PK समग्र रूप से मिलता है।
नोट: यदि तालिका खाली है अधिकतम (pkcolname) 1 mysql_insert_id () मूल MySQL C API फ़ंक्शन mysql_insert_id () के एक प्रकार के लंबे (PHP में नामित नाम) के रिटर्न प्रकार को धर्मान्तरित करता है।
यदि आपके AUTO_INCREMENT कॉलम में BIGINT का कॉलम है, तो mysql_insert_id () द्वारा लौटाया गया मान गलत होगा। इसके बजाय, SQL क्वेरी में आंतरिक MySQL SQL फ़ंक्शन LAST_INSERT_ID () का उपयोग करें।
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
बस ध्यान दें कि जब आप तालिका में डेटा सम्मिलित करने का प्रयास कर रहे हों और आपको त्रुटि मिले:
Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’
जैसे कुछ का उपयोग कर
INSERT INTO table (this, that) VALUES ($this, $that)
ऐसा इसलिए है क्योंकि जिन मूल्यों को आप तालिका में रखने की कोशिश कर रहे हैं, उनके आसपास आपको कोई एपोस्ट्रोफ नहीं मिला है। इसलिए आपको अपना कोड इसमें बदलना चाहिए:
INSERT INTO table (this, that) VALUES ('$this', '$that')
याद दिलाएं कि `` का उपयोग MySQL फ़ील्ड्स, डेटाबेस या तालिकाओं को परिभाषित करने के लिए किया जाता है, मूल्यों पर नहीं;)
क्वेरी के दौरान सर्वर से कनेक्शन खो गया:
http://dev.mysql.com/doc/refman/5.1/en/gone-away.html
http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html
http://dev.mysql.com/doc/refman/5.1/en/show-variables.html
http://dev.mysql.com/doc/refman/5.1/en/option-files.html
http://dev.mysql.com/doc/refman/5.1/en/error-log.html
ट्यूनिंग क्वेरी
http://www.artfulsoftware.com/infotree/queries.php?&bw=1313
अच्छा है कि मुझे लगता है कि बोनस कमाने के लिए पर्याप्त होना चाहिए ... एक महान मुक्त डेटाबेस के साथ कई घंटे और कई परियोजनाओं के फल । मैं ज्यादातर MySQL के साथ विंडोज़ प्लेटफार्मों पर एप्लिकेशन डेटा सर्वर विकसित करता हूं। मुझे जो सबसे ज्यादा गड़बड़ करनी थी वह थी
परम MySQL विरासत डेटाबेस दुःस्वप्न
इसके लिए तालिकाओं की एक श्रृंखला की आवश्यकता होती है ताकि यहां बताए गए कई ट्रिक्स का उपयोग करके तालिकाओं को किसी उपयोगी वस्तु में संसाधित किया जा सके।
यदि आपको यह आश्चर्यजनक मददगार लगा, तो इसे वोट करके अपना धन्यवाद व्यक्त करें।
इसके अलावा मेरे अन्य लेख और श्वेत पत्र देखें: www.coastrd.com