2009-06-03 34 views
10

Tôi đang sử dụng PHP và MySQL. Trong chương trình của tôi có một truy vấn chọn liên quan đến tham gia. Khi tôi chạy nó trên localhost nó làm việc tốt nhưng khi tôi tải nó trên máy chủ của tôi và cố gắng thực hiện nó sau đó nó tạo ra các lỗi sau:MySQL: "SELECT sẽ kiểm tra nhiều hơn MAX_JOIN_SIZE hàng"

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Làm thế nào tôi có thể sửa chữa điều này?

+0

giá trị của SELECT @@ MAX_JOIN_SIZE trên là gì của chúng tôi máy chủ? SELECT @@ MAX_JOIN_SIZE; có lẽ nó là không hợp lý thấp hoặc truy vấn của bạn có thể là ... suboptimal. – VolkerK

+0

Câu trả lời hay cho vấn đề này là ở đây: http://stackoverflow.com/a/950576/325365 –

Trả lời

8

Cố gắng chạy như một truy vấn thực hiện trước lựa chọn của bạn:

SET SQL_BIG_SELECTS=1 

Đây có phải là thực sự thực hiện trên một tập dữ liệu khổng lồ? Nếu không, điều này sẽ được giải quyết theo một cách khác.

0

Tôi đã gặp sự cố tương tự. Một trang web drupal của nó như vậy không có gì ngạc nhiên khi nó rơi xuống.

Đó là một câu hỏi phong cách cũ, tức là Select blah From table1, table2, table3 Where table1.id=table2.id And table2.some = 'thing'

Giống như @VolkerK nói, giải pháp là để di chuyển các khoản nơi mà kết quả đã lọc table2 trước đó mà phù hợp table1 để table2 (có hiệu quả tham gia các điều khoản), do đó giảm số lượng bản ghi cần phải khớp trong bảng 2 đến bảng 1.

17

Khi sử dụng PHP, SQL_BIG_SELECTS = 1 phải được đặt trong truy vấn riêng trước truy vấn chính của bạn. Ví dụ:

$mysqli = new mysqli("localhost", "root", "password", "db"); 

$mysqli->query("SET SQL_BIG_SELECTS=1"); //Set it before your main query 

$results = $mysqli->query("SELECT a, b, c FROM test"); 
while($row = $results->fetch_assoc()){ 
    echo '<pre>'; 
    print_r ($row); 
    echo '</pre>'; 
} 
+0

Có hoạt động tốt. Cảm ơn... – Chinmay235

0

Đối với tôi giải pháp là thêm khóa chỉ mục vào tất cả các cột mà các kết nối được sử dụng để khớp.

0

Nếu bạn đang sử dụng trình điều khiển PDO, thiết lập PDO::MYSQL_ATTR_INIT_COMMAND trong driver_options bạn mảng khi xây dựng một cơ sở dữ liệu mới xử lý

như vậy:

$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION SQL_BIG_SELECTS=1')); 
Các vấn đề liên quan