2009-01-06 13 views

उत्तर

-4

मुझे mysql में ऐसा करने के तरीके से अवगत नहीं है, लेकिन चूंकि आप set_time_limit() से php में परिचित हैं, तो समय सीमा को सीमित करने के लिए SQL क्वेरी को php स्क्रिप्ट में क्यों नहीं चलाते?

+10

आपकी क्वेरी को फिर से लिखने मैं बहुत यकीन है कि PHP स्क्रिप्ट के बाद बाहर निकल जाता है, भले ही समय समाप्त, MySQL क्वेरी को दिया गया था प्रसंस्करण रखेंगे हूँ। – Rafa

+0

डेटाबेस निष्पादन समय को प्रभावित नहीं करता 'set_time_limit()' – JamesHalsall

+0

@JamesHalsall (विंडोज, जहां 'set_time_limit()' एक दीवार घड़ी समय सीमा के बजाय एक निष्पादन समय सीमा के सेट पर छोड़कर।) –

4

आप इस अन्य एसओ पर जवाब पा सकते हैं। प्रश्न:

MySQL - can I limit the maximum time allowed for a query to run?

हर अपने डेटाबेस सर्वर पर दूसरा चलाता है कि, जोड़ने और कुछ इस तरह कर रही एक क्रॉन जॉब:

  • शो PROCESSLIST
  • एक प्रश्न समय के साथ सभी कनेक्शनों का पता लगाएं आपके अधिकतम वांछित समय से बड़ा
  • उन प्रक्रियाओं में से प्रत्येक के लिए किल [प्रक्रिया आईडी] चलाएं
18

मैंने सोचा कि यह थोड़ी देर के आसपास किया गया है, लेकिन this के अनुसार,

MySQL 5.7.4 मिलीसेकंड में निर्दिष्ट सर्वर साइड निष्पादन समय सीमा निर्धारित करने की क्षमता है, शीर्ष स्तर पढ़ने के लिए, का परिचय केवल चयन कथन।

SELECT 
MAX_EXECUTION_TIME = 1000 --in milliseconds 
* 
FROM table; 

ध्यान दें कि के लिए यह केवल काम करता है केवल पढ़ने के बयान का चयन करें।

अद्यतन: यह चर MySQL 5.7.4 में जोड़ा गया और MySQL 5.7.8 में max_execution_time को नाम दिया। (source)

+0

केवल इस क्वेरी या सभी सत्रों को उसी सत्र (प्रक्रिया आईडी) साझा करने के लिए सक्रिय? – mgutt

+0

यह केवल उस क्वेरी पर लागू होता है जिसमें यह निर्दिष्ट है। यदि आप मेरे उद्धृत स्रोत पर जाते हैं, तो आप वैश्विक या सत्र max_execution_time सेट कर सकते हैं। – Westy92

+0

हाँ मैंने पढ़ा है कि है, लेकिन वहाँ व्याख्या क्या 'session' का मतलब है क्योंकि उदाहरण के लिए' KILL' स्पष्ट संशोधक 'QUERY' की जरूरत नहीं है: https://dev.mysql.com/doc/refman/5.7/en/kill। एचटीएमएल और यह जवाब '' session' connection' के लिए एक अन्य शब्द के रूप में स्पष्ट किया गया था में: http://stackoverflow.com/a/8800971/318765 – mgutt

7

आप उपयोग कर रहे हैं mysql native driver (आम php 5.3 के बाद से), और mysqli एक्सटेंशन, जिसे आप एक अतुल्यकालिक क्वेरी के साथ ऐसा कर सकते हैं:

<?php 

// Here's an example query that will take a long time to execute. 
$sql = " 
    select * 
    from information_schema.tables t1 
    join information_schema.tables t2 
    join information_schema.tables t3 
    join information_schema.tables t4 
    join information_schema.tables t5 
    join information_schema.tables t6 
    join information_schema.tables t7 
    join information_schema.tables t8 
"; 

$mysqli = mysqli_connect('localhost', 'root', ''); 
$mysqli->query($sql, MYSQLI_ASYNC | MYSQLI_USE_RESULT); 
$links = $errors = $reject = []; 
$links[] = $mysqli; 

// wait up to 1.5 seconds 
$seconds = 1; 
$microseconds = 500000; 

$timeStart = microtime(true); 

if (mysqli_poll($links, $errors, $reject, $seconds, $microseconds) > 0) { 
    echo "query finished executing. now we start fetching the data rows over the network...\n"; 
    $result = $mysqli->reap_async_query(); 
    if ($result) { 
     while ($row = $result->fetch_row()) { 
      // print_r($row); 
      if (microtime(true) - $timeStart > 1.5) { 
       // we exceeded our time limit in the middle of fetching our result set. 
       echo "timed out while fetching results\n"; 
       var_dump($mysqli->close()); 
       break; 
      } 
     } 
    } 
} else { 
    echo "timed out while waiting for query to execute\n"; 
    var_dump($mysqli->close()); 
} 

झंडे मैं mysqli_query को दे रहा हूँ महत्वपूर्ण चीजें हासिल करें। यह क्लाइंट ड्राइवर को एसिंक्रोनस मोड सक्षम करने के लिए कहता है, जबकि हमें अधिक वर्बोज़ कोड का उपयोग करने के लिए मजबूर करता है, लेकिन हमें टाइमआउट का उपयोग करने देता है (और यदि आप चाहें समवर्ती प्रश्न भी जारी करते हैं!)। दूसरा ध्वज क्लाइंट को पूरे परिणाम सेट को मेमोरी में बफर न करने के लिए कहता है।

डिफ़ॉल्ट रूप से, php अपने mysql क्लाइंट लाइब्रेरी को आपकी क्वेरी के पूरे परिणाम सेट को स्मृति में लाने के लिए कॉन्फ़िगर करता है इससे पहले कि यह आपके PHP कोड परिणाम में पंक्तियों तक पहुंचने देता है। बड़े परिणाम को स्थानांतरित करने में लंबा समय लग सकता है। हम इसे अक्षम करते हैं, अन्यथा हम जोखिम लेते हैं कि बफरिंग को पूरा करने के लिए प्रतीक्षा करते समय हम समय निकाल सकते हैं।

नोट दो स्थानों पर जहां हम एक समय सीमा से अधिक के लिए जांच करने की जरूरत है कि वहाँ:

  • वास्तविक क्वेरी निष्पादन
  • जबकि परिणाम (डेटा) प्राप्त करने

आप समान पूरा कर सकते हैं पीडीओ और नियमित mysql विस्तार में। वे एसिंक्रोनस क्वेरी का समर्थन नहीं करते हैं, इसलिए आप क्वेरी निष्पादन समय पर टाइमआउट सेट नहीं कर सकते हैं। हालांकि, वे unbuffered परिणाम सेट का समर्थन करते हैं, और इसलिए आप डेटा को लाने पर कम से कम एक टाइमआउट लागू कर सकते हैं।

कई प्रश्नों के लिए, mysql के लगभग तुरंत करने के लिए परिणाम स्ट्रीमिंग शुरू करने में सक्षम है, और इसलिए unbuffered प्रश्नों अकेले आप कुछ हद तक प्रभावी ढंग से कुछ क्वेरी पर समय समाप्ति को लागू करने के लिए अनुमति देगा। उदाहरण के लिए, एक

select * from tbl_with_1billion_rows 

पंक्तियों स्ट्रीमिंग तुरंत शुरू कर सकते हैं लेकिन,

select sum(foo) from tbl_with_1billion_rows 

पूरे मेज पर कार्रवाई करने के पहले यह आप के लिए पहली पंक्ति लौट रहा शुरू कर सकते हैं की जरूरत है। यह बाद का मामला यह है कि एक एसिंक्रोनस क्वेरी पर टाइमआउट आपको बचाएगा। यह आपको सादे पुराने डेडलॉक्स और अन्य सामानों से भी बचाएगा।

ps - मैं कनेक्शन पर ही किसी भी समय समाप्त तर्क शामिल नहीं किया।

+0

से/* + MAX_EXECUTION_TIME (1000) */* का चयन करें यह अविश्वसनीय है ..... मैं इसे आजमाने के लिए इंतजार नहीं कर सकता ..... अच्छा उदाहरण के लिए ग्राफ डेटा प्रश्नों .... –

+0

यह एक mysql क्वेरी एसक्यूएल सर्वर पर इस प्रक्रिया में है कि बंद नहीं होगा। हालांकि, एक अलग सवाल का एक उत्कृष्ट समाधान। – TheSatinKnight

+0

@TheSatinNight क्या आप इसके बारे में निश्चित हैं? 'क्वेरी()' पर कॉल async है, इसलिए यह तुरंत लौटता है। अगली कॉल 'मतदान() 'है, जिसमें एक टाइमआउट है। चुनाव केवल प्रश्नों कि काटा जा करने के लिए तैयार कर रहे हैं उत्पादन करेगा ... इसलिए जहां इस "इस प्रक्रिया में क्वेरी" आप की बात कर रहा है? – goat

0

pt_kill इस तरह के लिए एक विकल्प है। लेकिन यह निरंतर निगरानी नहीं है, मांग पर है। यह करता है @Rafa क्या सुझाव दिया। हालांकि cron के साथ आने के संकेत के लिए --sentinel देखें।

0

कृपया तरह

select /*+ MAX_EXECUTION_TIME(1000) */ * from table

संबंधित मुद्दे