Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या MySQL FIND_IN_SET या समकक्ष को इंडेक्स का उपयोग करने के लिए बनाया जा सकता है?

आपकी टिप्पणी के संदर्भ में:

<ब्लॉकक्वॉट>

@MarcB डेटाबेस सामान्यीकृत है, CSV स्ट्रिंग UI से आती है।" मुझे निम्नलिखित लोगों के लिए डेटा प्राप्त करें:101,202,303"

इस उत्तर में अल्पविराम द्वारा अलग की गई केवल उन संख्याओं पर ध्यान केंद्रित किया गया है। क्योंकि, जैसा कि यह निकला, आप FIND_IN_SET . के बारे में भी बात नहीं कर रहे थे बाद में।

हां, आप जो चाहें हासिल कर सकते हैं। आप एक तैयार कथन बनाते हैं जो एक स्ट्रिंग को इस हाल के उत्तर जैसे पैरामीटर के रूप में स्वीकार करता है। मेरा। उस उत्तर में, दूसरे ब्लॉक को देखें जो CREATE PROCEDURE . दिखाता है और इसका दूसरा पैरामीटर जो एक स्ट्रिंग को स्वीकार करता है जैसे (1,2,3) . मैं एक पल में इस बिंदु पर वापस आऊंगा।

ऐसा नहीं है कि आपको इसे @spraff देखने की ज़रूरत है, लेकिन अन्य शायद। मिशन प्रकार . प्राप्त करना है !=सभी, और possible_keys और कुंजी जैसा कि आपने अपने दूसरे ब्लॉक में दिखाया था, शून्य न दिखाने के लिए समझाएं। विषय पर सामान्य पढ़ने के लिए, लेख देखें समझना EXPLAIN का आउटपुट और MySQL मैनुअल पेज जिसका शीर्षक है EXPLAIN अतिरिक्त जानकारी

अब, (1,2,3) . पर वापस जाएं उपरोक्त संदर्भ। हम आपकी टिप्पणी से जानते हैं, और आपके दूसरे प्रश्न में आउटपुट की व्याख्या करें कि यह निम्नलिखित वांछित शर्तों को पूरा करता है:

  1. type =range (और विशेष रूप से सभी नहीं)। इस पर ऊपर दिए गए दस्तावेज़ देखें।
  2. कुंजी रिक्त नहीं है

ये ठीक वही स्थितियां हैं जो आपके दूसरे स्पष्टीकरण आउटपुट में हैं, और आउटपुट जिसे निम्न क्वेरी के साथ देखा जा सकता है:

explain 
select * from ratings where id in (2331425, 430364, 4557546, 2696638, 4510549, 362832, 2382514, 1424071, 4672814, 291859, 1540849, 2128670, 1320803, 218006, 1827619, 3784075, 4037520, 4135373, ... use your imagination ..., ...,  4369522, 3312835);

जहां मेरे पास उस in . में 999 मान हैं खंड सूची। यह इस उत्तर से एक नमूना है परिशिष्ट डी में मेरा सीएसवी की ऐसी यादृच्छिक स्ट्रिंग उत्पन्न करता है, जो खुले और करीबी कोष्ठक से घिरा हुआ है।

और नीचे दिए गए क्लॉज में उस 999 तत्व के लिए आउटपुट की व्याख्या करें:

उद्देश्य हासिल किया। आप इसे इस लिंक में पहले बताए गए संग्रह के समान संग्रहीत खरीद के साथ प्राप्त करते हैं। तैयार विवरण (और वे चीजें concat() . का उपयोग करती हैं उसके बाद EXECUTE )।

सूचकांक का उपयोग किया जाता है, एक टेबलस्कैन (मतलब खराब) का अनुभव नहीं होता है। आगे की रीडिंग हैं रेंज जॉइन टाइप , कोई भी संदर्भ जो आप MySQL के लागत-आधारित अनुकूलक (CBO) पर पा सकते हैं, यह उत्तर vladr से हालांकि दिनांकित है, पर नजर रखते हुए विश्लेषण तालिका भाग, विशेष रूप से महत्वपूर्ण डेटा परिवर्तन के बाद। ध्यान दें कि ANALYZE को अति-विशाल डेटासेट पर चलने में काफी समय लग सकता है। कभी-कभी कई घंटे।

एसक्यूएल इंजेक्शन हमले:

संग्रहीत प्रक्रियाओं को पारित स्ट्रिंग्स का उपयोग SQL इंजेक्शन हमलों के लिए एक हमला वेक्टर है। उपयोगकर्ता द्वारा प्रदत्त डेटा का उपयोग करते समय उन्हें रोकने के लिए सावधानियां बरतनी चाहिए। यदि आपका रूटीन आपके सिस्टम द्वारा जनरेट की गई आपकी अपनी आईडी पर लागू होता है, तो आप सुरक्षित हैं। ध्यान दें, हालांकि, दूसरे स्तर के SQL इंजेक्शन हमले तब होते हैं जब डेटा को रूटीन द्वारा रखा गया था जो उस डेटा को पहले डालने या अपडेट में स्वच्छ नहीं करता था। हमले पहले डेटा के माध्यम से किए जाते हैं और बाद में उपयोग किए जाते हैं (एक प्रकार का टाइम बम)।

तो यह उत्तर समाप्त है अधिकांश भाग के लिए।

नीचे उसी तालिका का एक दृश्य है जिसमें एक मामूली संशोधन के साथ यह दिखाया गया है कि एक खतरनाक टेबलस्कैन क्या है पिछली क्वेरी की तरह दिखेगा (लेकिन एक गैर-अनुक्रमित कॉलम के खिलाफ जिसे thing . कहा जाता है) )।

हमारी वर्तमान तालिका परिभाषा पर एक नज़र डालें:

CREATE TABLE `ratings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `thing` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5046214 DEFAULT CHARSET=utf8;

select min(id), max(id),count(*) as theCount from ratings;
+---------+---------+----------+
| min(id) | max(id) | theCount |
+---------+---------+----------+
|       1 | 5046213 |  4718592 |
+---------+---------+----------+

ध्यान दें कि कॉलम चीज़ पहले एक अशक्त इंट कॉलम था।

update ratings set thing=id where id<1000000;
update ratings set thing=id where id>=1000000 and id<2000000;
update ratings set thing=id where id>=2000000 and id<3000000;
update ratings set thing=id where id>=3000000 and id<4000000;
update ratings set thing=id where id>=4000000 and id<5100000;
select count(*) from ratings where thing!=id;
-- 0 rows

ALTER TABLE ratings MODIFY COLUMN thing int not null;

-- current table definition (after above ALTER):
CREATE TABLE `ratings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `thing` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5046214 DEFAULT CHARSET=utf8;

और फिर समझाएं कि एक टेबलस्कैन है (कॉलम के खिलाफ thing ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC के साथ MySQL का उपयोग करके .sql स्क्रिप्ट चलाना

  2. मूल्यों की सूची में नहीं के लिए MySQL चर प्रारूप

  3. MySQL और PostgreSQL के लिए HAProxy सांख्यिकी को समझना

  4. PHP दिनांक () प्रारूप MySQL में डेटाटाइम में सम्मिलित करते समय

  5. MySQL डेटाबेस को आयात और निर्यात कैसे करें