Max_execution_time trong MySQL là gì?

Nếu bạn đang sử dụng trình điều khiển gốc mysql (phổ biến kể từ php 5. 3) và tiện ích mở rộng mysqli, bạn có thể thực hiện việc này bằng truy vấn không đồng bộ

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";

    // kill the thread to stop the query from continuing to execute on 
    // the server, because we are abandoning it.
    var_dump($mysqli->kill($mysqli->thread_id));
    var_dump($mysqli->close());
}

Những lá cờ tôi đang trao cho mysqli_query hoàn thành những việc quan trọng. Nó yêu cầu trình điều khiển máy khách kích hoạt chế độ không đồng bộ, đồng thời buộc chúng tôi sử dụng nhiều mã dài dòng hơn, nhưng cho phép chúng tôi sử dụng thời gian chờ (và cũng đưa ra các truy vấn đồng thời nếu bạn muốn. ). Cờ khác yêu cầu máy khách không đệm toàn bộ kết quả vào bộ nhớ

Theo mặc định, php định cấu hình các thư viện máy khách mysql của nó để tìm nạp toàn bộ tập hợp kết quả truy vấn của bạn vào bộ nhớ trước khi nó cho phép mã php của bạn bắt đầu truy cập các hàng trong kết quả. Điều này có thể mất nhiều thời gian để chuyển một kết quả lớn. Chúng tôi vô hiệu hóa nó, nếu không, chúng tôi có nguy cơ hết thời gian chờ trong khi chờ quá trình lưu vào bộ đệm hoàn tất

Lưu ý rằng có hai nơi chúng tôi cần kiểm tra xem có vượt quá giới hạn thời gian không

  • Việc thực hiện truy vấn thực tế
  • trong khi tìm nạp kết quả (dữ liệu)

Bạn có thể thực hiện tương tự trong PDO và tiện ích mở rộng mysql thông thường. Chúng không hỗ trợ các truy vấn không đồng bộ, vì vậy bạn không thể đặt thời gian chờ cho thời gian thực hiện truy vấn. Tuy nhiên, chúng hỗ trợ các tập kết quả không có bộ đệm và do đó, ít nhất bạn có thể triển khai thời gian chờ khi tìm nạp dữ liệu

Đối với nhiều truy vấn, mysql có thể bắt đầu truyền kết quả cho bạn gần như ngay lập tức và do đó, riêng các truy vấn không có bộ đệm sẽ cho phép bạn thực hiện hiệu quả phần nào thời gian chờ đối với một số truy vấn nhất định. Ví dụ, một

select * from tbl_with_1billion_rows

có thể bắt đầu phát trực tuyến các hàng ngay lập tức, nhưng,

select sum(foo) from tbl_with_1billion_rows

cần xử lý toàn bộ bảng trước khi có thể bắt đầu trả lại hàng đầu tiên cho bạn. Trường hợp sau này là thời gian chờ trên một truy vấn không đồng bộ sẽ giúp bạn tiết kiệm. Nó cũng sẽ cứu bạn khỏi những bế tắc cũ và những thứ khác

Bạn có thể tự hỏi liệu người dùng của bạn có thể làm chậm hoặc thậm chí DOS cơ sở dữ liệu MySQL của bạn với một yêu cầu không may mắn hay không. Nếu nó chỉ chứa sai số lượng điều kiện trong biểu mẫu tìm kiếm nâng cao của bạn, kích hoạt quá trình quét toàn bộ bảng trên tập dữ liệu lớn hơn nhiều so với bạn dự đoán thì có thể họ có thể

Nếu bạn cung cấp chức năng tìm kiếm nâng cao, thống kê tổng hợp, báo cáo hoặc xuất dữ liệu trong ứng dụng của mình, thì truy vấn chạy dài không thường xuyên là một phần của thiết kế. Bạn có thể chưa bị quá tải và chậm cơ sở dữ liệu, chỉ vì người dùng của bạn không thường xuyên sử dụng các tính năng này

Cho đến MySQL 5. 7, bạn không có cách nào dễ dàng để tự bảo vệ mình khỏi một lượng lớn người dùng DDoS cơ sở dữ liệu của bạn bằng các truy vấn chạy dài. Ngoài ra, PHP max_execution_time không áp dụng cho việc chờ các cuộc gọi mạng như được hiển thị trong bài đăng trên blog trước đây trên max_execution_time. Điều này có nghĩa là các tập lệnh PHP và kết nối MySQL của bạn có thể bị chặn miễn là truy vấn chạy, trường hợp xấu nhất là vài phút hoặc vài giờ

Khi bạn Google vấn đề này, giải pháp được đề xuất là chạy một daemon hoặc cronjob theo dõi danh sách quy trình và chỉ loại bỏ các truy vấn chạy dài. Điều này chắc chắn hoạt động, nhưng bạn không biết ai đang chạy truy vấn và tại sao, điều này ngăn bạn áp dụng thời gian chờ chi tiết hơn dựa trên ngữ cảnh (ví dụ: web so với quy trình nền)

Với MySQL5. 7, giờ đây bạn có thể sử dụng gợi ý truy vấn trình tối ưu hóa mới cho các truy vấn SELECT trong Mili giây

SELECT /*+ MAX_EXECUTION_TIME(1000) */ status, count(*) FROM articles GROUP BY status ORDER BY status; 

Hoặc bạn có thể thiết lập một

SET SESSION MAX_EXECUTION_TIME=2000; SET GLOBAL MAX_EXECUTION_TIME=2000; 

Thời gian chờ chỉ áp dụng cho các truy vấn CHỌN chỉ đọc

Nếu truy vấn của bạn mất nhiều thời gian, nó sẽ không thành công với lỗi sau

ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded 

Bạn có thể xử lý lỗi này một cách tập trung trong ứng dụng của mình và hiển thị thông báo cho người dùng rằng phản hồi mất quá nhiều thời gian và đã bị hủy bỏ

Sử dụng phần mềm Theo dõi ngoại lệ (chẳng hạn như Tideways), bạn có thể ghi nhật ký người dùng, giao dịch hoặc trang nào đang khiến các truy vấn này bị hủy bỏ, tần suất chúng xảy ra và liệu hiệu suất truy vấn có thể được cải thiện hay không

Thời gian thực hiện tối đa trong MySQL là gì?

SET TOÀN CẦU MAX_EXECUTION_TIME=1000; . Giá trị mặc định cho biến TOÀN CẦU là 0, có nghĩa là không có giới hạn thời gian toàn cầu .

Làm cách nào để kiểm tra Max_execution_time trong MySQL?

HIỂN THỊ CÁC BIẾN NHƯ 'MAX_EXECUTION_TIME' hoặc chọn @@max_execution_time để truy xuất . "Thời gian chờ thực hiện cho các câu lệnh SELECT, tính bằng mili giây. Nếu giá trị là 0, thời gian chờ KHÔNG được bật. " theo tài liệu.

Làm cách nào để tăng thời gian truy vấn trong MySQL?

Mẹo để cải thiện hiệu suất truy vấn MySQL .
Tối ưu hóa cơ sở dữ liệu của bạn. Bạn cần biết cách thiết kế lược đồ để hỗ trợ truy vấn hiệu quả. .
Tối ưu hóa tham gia. Giảm các câu lệnh nối trong các truy vấn. .
Lập chỉ mục Tất cả các cột được sử dụng trong các mệnh đề 'where', 'order by' và 'group by'. CHỈ SỐ. .
Sử dụng Tìm kiếm Toàn văn. .
Bộ nhớ đệm truy vấn MySQL

Thời gian chờ mặc định của MySQL là gì?

Giá trị mặc định là 30 giây . Tránh giá trị bằng 0, điều này biểu thị thời gian chờ vô thời hạn. Để thay đổi thời gian chờ lệnh mặc định, hãy sử dụng tùy chọn chuỗi kết nối Thời gian chờ lệnh mặc định.