Mysql क्वेरी लंबे समय का उपयोग कर जहां चर

0

सवाल

मैं था एक mysql घटना है और चलाता है भयपूर्ण दिन में 9:45 पर हूँ.

Begin
 SET @v_ym :=(SELECT extract(year_month from DATE_SUB(SYSDATE(),INTERVAL 1 DAY)));
 SELECT CAST(@ym AS CHAR);
 select ssaname,extract(year_month from date_sub(sysdate(),interval 1 day)) ym,
        omcr.btscount_ssa(ssaname) btscount,sum(case when duration>30 then duration else 0 end) dur_30 from
        btsoutage.bts_faults 
        where ym=@v_ym  and ssaname is not null
        group by ssaname;
END;

क्वेरी में [ym है yearmonth और ym अनुक्रमित है] जब मैं विकल्प के साथ चर @v_ym यह ले जा रहा है पूर्ण तालिका स्कैन और तालिका को बंद कर दिया है और आगे के लिए सम्मिलित करता है. जहां के रूप में जब मैं मान दिया सीधे इसे उपयोग कर रहा है, सूचकांक और उत्पादन तेजी से है ।

तालिका में 10 लाख से अधिक रिकॉर्ड है ।

पैदा टेबल है

CREATE TABLE IF NOT EXISTS `bts_faults` (
  `bts_name` varchar(250) DEFAULT NULL,
  `make` varchar(10) DEFAULT NULL,
  `occuredtime` datetime DEFAULT NULL,
  `clearedtime` datetime DEFAULT NULL,
  `duration` int(10) DEFAULT NULL,
  `reason` varchar(100) DEFAULT NULL,
  `site_type` varchar(10) DEFAULT NULL,
  `tech` varchar(5) DEFAULT NULL,
  `fault_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `ssaname` varchar(20) DEFAULT NULL,
  `fault_type` int(1) DEFAULT '0',
  `remarks` varchar(250) DEFAULT NULL,
  `bts_section` varchar(100) DEFAULT NULL,
  `vendor` varchar(50) DEFAULT NULL,
  `occureddate` date DEFAULT NULL,
  `cleareddate` date DEFAULT NULL,
  `ym` varchar(6) DEFAULT NULL,
  `updatedate` datetime DEFAULT NULL,
  `USERNAME` varchar(100) DEFAULT NULL,
  `mask` int(1) DEFAULT '0',
  `mask_cat` varchar(10) DEFAULT NULL,
  `outage_cat` varchar(20) DEFAULT NULL,
  `site_category` varchar(50) DEFAULT NULL,
  `escalated_time` datetime DEFAULT NULL,
  `zone` varchar(20) DEFAULT NULL,
  `zone_fault_reason` varchar(500) DEFAULT NULL,
  `zone_fault_remarks` varchar(500) DEFAULT NULL,
  `zone_username` varchar(20) DEFAULT NULL,
  `zone_updatetime` datetime DEFAULT NULL,
  `zone_fault_duration` int(11) DEFAULT NULL,
  `fault_category` varchar(250) DEFAULT NULL,
  `remarks_1` varchar(2500) DEFAULT NULL,
  PRIMARY KEY (`fault_id`),
  UNIQUE KEY `UIDX_BTS_FAULTS` (`bts_name`,`occuredtime`),
  KEY `indx_btsfaults_ym` (`ym`),
  KEY `indx_btsfaults_cleareddate` (`cleareddate`),
  KEY `Index_btsfaults_btsname` (`bts_name`),
  KEY `index_btsfaults_ssaname` (`ssaname`),
  KEY `indx_btsfaults_occureddate` (`occureddate`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3807469710 DEFAULT CHARSET=latin1

को समझाने के लिए योजना के 2 प्रकार हैं

enter image description here

events mysql
2021-11-20 18:59:15
1

सबसे अच्छा जवाब

1

क्या प्रतिशत की तालिका में "वर्तमान" महीने? अगर है कि और अधिक की तरह कुछ की तुलना में 20% है, तो वहाँ है कोई फिक्स-एक तालिका स्कैन करने की संभावना है, तेजी से हो । यदि यह कम से कम 20% है, तो, आप के रूप में संदेह है, @चर हो सकता खलनायक. उस मामले में, परिवर्तन करने के लिए परीक्षण किया जा

 WHERE ym = CAST(
          extract(year_month from DATE_SUB(SYSDATE(),INTERVAL 1 DAY))
                 AS CHAR)
   AND ...

बहुत तेजी से हो जाएगा का निर्माण करने और बनाए रखने के एक सारांश तालिका के साथ एक PRIMARY KEY के दिन और ssaname. इस तरह के उप-योग के लिए प्रत्येक दिन है. इसे रखा जाएगा के रूप में या तो डेटा है INSERTed या हर रात आधी रात के बाद.

फिर 9:45 प्रश्न बन जाता है बहुत तेजी से है. शायद इतनी तेजी से कि तुम भी नहीं की जरूरत है यह करने के लिए सिर्फ एक दिन में एक बार, लेकिन इसके बजाय "मांग पर".

अधिक चर्चा: http://mysql.rjweb.org/doc.php/summarytables

मैं सुझाव है कि आप का उपयोग करें NOW() के बजाय SYSDATE() -- पूर्व के दौरान निरंतर एक बयान; उत्तरार्द्ध नहीं है.

bts_faults की तरह लग रहा है यह हो सकता है एक टेराबाइट में आकार. यदि हां, तो आप शायद नहीं करना चाहते हैं, यहाँ बनाने के लिए तरीके छोटा होता है ।

अगर Auto_inc मूल्य में 3.8 बी, अभी तक वहाँ ही रहे हैं 10 पंक्तियाँ, इसका मतलब यह है कि आप कर रहे हैं को मिटाने के लिए 'पुराने' डेटा? क्या आप चाहते हैं पर चर्चा करने के लिए तेजी से ऊपर को हटाता है? (शुरू में एक नया सवाल यदि आप ऐसा करते हैं.)

2021-11-21 06:31:56

अभी भी काम नहीं कर के परिवर्तन के साथ अब(), select ym, ssaname, omcr.btscount_ssa(ssaname) btscount,sum(case when duration>30 then duration else 0 end) dur_30 from btsoutage.bts_faults where ym=EXTRACT(YEAR_MONTH FROM (DATE_SUB(NOW(), INTERVAL 1 DAY)))group by ym, ssaname; यह नहीं है का उपयोग कर बनाई गई सूचकांक पर ym , जहां के रूप में एक ही क्वेरी काम कर रहा है जब तेजी से निकालने(YEAR_MONTH से (DATE_SUB(अब(), अंतराल 1 दिन))) द्वारा बदल दिया है 202111 तालिका में केवल 18Million डेटा.
sriman narayana

@srimannarayana - आह... मुझे लगता है कि मैं इस मुद्दे को देखने. मैं था "varchar = तिथि-निरंतर" चलो इसे बदलने के लिए "varchar = चार-निरंतर". मैं संशोधित मेरा जवाब.
Rick James

@srimannarayana - कृपया जोड़ने के लिए संशोधित SELECT और इसके EXPLAIN अपने प्रश्न के लिए.
Rick James

को समझाने paln के लिए 2 प्रश्नों में जोड़ा जाता है के सवाल का
sriman narayana

@srimannarayana - मैं देख नहीं है CAST इस्तेमाल किया जा रहा करने के लिए मूल्य मिलता है. यह एक डेटा प्रकार मुद्दा है, तो मैं की जरूरत डाली है ।
Rick James

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में