मेरे पास निम्नलिखित एसक्यूएल क्वेरी है:

select a,b from table left join table2 on ... 
   where
     table.date > (some date) and 
     table.date < (some date) and
     table.first not like '%condition1%' and
     table.first not like '%condition2%' and
     table.first not like '%condition3%' and
     table.first not like '%condition4%' and
     table.first not like '%condition5%'
limit 500 offset 500

"टेबल" - एक बहुत बड़ा विभाजित टेबल है, जैसे कि तारीख पर इंडेक्स लागू होने के बाद हमें फ़िल्टरिंग के लिए स्कैन करने के लिए लगभग 4.2M पंक्तियाँ मिल रही हैं।

तो यह क्वेरी बहुत तेजी से काम करती है - लगभग 250ms में, यह कैसे संभव है? क्या हमने बड़े टेबल पर किसी भी तरह से लाइक का इस्तेमाल नहीं करना सिखाया, खासकर ऐसे में जहां % दोनों दिशाओं में लगाया जाता है?

बेशक "टेबल" - "पहले" कॉलम पर कोई इंडेक्स नहीं है। Percona संस्करण काफी पुराना है - 5.5.61-38.13.

इस व्यवहार को कैसे समझाया जा सकता है?

0
mrAndersen 25 फरवरी 2020, 18:16

2 जवाब

ठीक है, मुझे यह मिल गया। समस्या यह थी कि मेरी क्वेरी में "ऑर्डर बाय" की कमी थी। इस क्वेरी में क्रम जोड़ने से क्वेरी का समय 6 सेकंड तक बढ़ जाता है - जो अब समझ में आता है।

तो पिछली स्थिति में MySQL सिर्फ 5 समान पैटर्न से मेल खाने वाले किसी भी डेटा की तलाश में था, जो अब बताता है कि 500 ​​सीमा ऑफसेट के अलावा यह इतनी तेजी से क्यों काम कर रहा था

1
mrAndersen 25 फरवरी 2020, 18:36

मेरा सुझाव है कि आप प्रमुख वाइल्डकार्ड वाली LIKE खोजों से बचें। प्रमुख वाइल्डकार्ड (उदा. '%condition1%') के साथ समान खोजों का उपयोग करते समय डेटाबेस किसी अनुक्रमणिका का उपयोग नहीं करेगा। हालांकि यह हमेशा एक संतोषजनक समाधान नहीं होता है, कृपया उपसर्ग-मिलान LIKE पैटर्न (जैसे 'TERM%') का उपयोग करने पर विचार करें।

सर्वोत्तम अभ्यास उदाहरण:

SELECT
  id,
  text
FROM
  tbl
WHERE
  text LIKE 'TERM%';

खराब अभ्यास उदाहरण:

SELECT
  id,
  text
FROM
  tbl
WHERE
  text LIKE '%TERM%';

साथ ही, OFFSET उच्च ऑफ़सेट के साथ उपयोग किए जाने पर क्लॉज़ बहुत धीमे हो सकते हैं (उदाहरण के लिए पेजिंग लागू करते समय उच्च पृष्ठ संख्या के साथ)। इसके बजाय, निम्न खोज पद्धति का उपयोग करें, जो बेहतर और अधिक स्थिर प्रतिक्रिया दर प्रदान करती है।

सर्वोत्तम अभ्यास उदाहरण:

SELECT
  name,
  age,
  department
FROM
  employees
WHERE
  (id, age) > (5000, 40)
ORDER BY
  id,
  age
LIMIT
  10;

खराब अभ्यास उदाहरण:

SELECT
  name,
  age,
  department
from
  employees
where
  age > 40
ORDER BY
  age
LIMIT
  10 OFFSET 5000;

अस्वीकरण: मैं एवरएसक्यूएल का सह-संस्थापक हूं, और आप स्वचालित रूप से अपनी क्वेरी को तेज कर सकते हैं @ एवरएसक्यूएल ऑनलाइन एसक्यूएल ऑप्टिमाइज़र

1
arsho 23 मार्च 2020, 20:03