2009-06-08 26 views
6

Tôi đang đặt câu hỏi này thay mặt cho một nhóm nhỏ người dùng của tôi có vấn đề này.Lỗi MySQL MAX_JOIN_SIZE

Một khi kịch bản họ đang sử dụng được cho ID 21, nó tạo ra các lỗi sau:

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

Tôi đã nghiên cứu này càng nhiều càng tốt và tìm thấy một cái gì đó của một câu trả lời: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

Các vấn đề là họ đang trên chia sẻ lưu trữ để họ không thể thay đổi cài đặt MySQL của họ để sửa chữa các lỗi.

Có bất kỳ điều gì tôi có thể viết vào tập lệnh của mình để chúng không có vấn đề này không?

Đây là hàm tạo truy vấn cơ sở dữ liệu dựa trên mô-đun nào được tải: $ sql = 'SELECT a.id làm id, a.address làm địa chỉ';

 $query = 'SELECT' 
       . ' name AS module_name' 
       . ', databasename AS module_database' 
       . ', pregmatch AS module_pregmatch' 
       . ', pregmatch2 AS module_pregmatch2' 
       . ', html AS module_html' 
       . ', sqlselect AS database_sqlselect' 
       . ', sqljoin AS database_sqljoin' 
       . ', sqlupdatewithvalue AS database_sqlupdatewithvalue' 
       . ', sqlupdatenovalue AS database_sqlupdatenovalue' 
       . ' FROM #__aqsgmeta_modules' 
       . ' WHERE enabled = 1' 
       . ' ORDER BY id';      
     $db->setQuery($query); 
     $results = $db->loadObjectList(); 
     if (count($results) != 0) { 
      foreach ($results as $result) { 
       $sqlselect .= ', '; 
       $sqlselect .= $result->database_sqlselect; 

       $sqljoin .= ' '; 
       $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin); 
       if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
        $sqljoin .= $result->database_sqljoin; 
      } 
     } 

     if ($use_sh404sef) 
      $sqlselect .= ', g.oldurl AS sefurl'; 
     $sql .= $sqlselect; 
     $sql .= ' FROM #__aqsgmeta_address AS a'; 
     $sql .= $sqljoin; 

     if ($use_sh404sef) 
      $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address'; 

     $sql .= 
     //. ' WHERE a.id IN (' . $cids . ')' 
     ' WHERE a.id = ' . $id 
     . ' ORDER BY a.address asc,a.id ' 
     ; 
     $db->setQuery($sql); 
     $rows = $db->loadObjectList(); 
+0

Bạn hoàn toàn chắc chắn rằng truy vấn được tối ưu hóa, tức là không có cách nào để có được kết quả tương tự với ít tập hợp kết quả trung gian hơn? – VolkerK

Trả lời

13

MAX_JOIN_SIZE một nhược điểm an toàn thường được sử dụng trên Hostings chia sẻ.

Nó sẽ không cho phép bạn vô tình chạy các truy vấn dài sẽ treo máy chủ.

Issue lệnh này:

SET OPTION SQL_BIG_SELECTS = 1 

trước khi chạy truy vấn mà bạn biết để trở lại rất nhiều giá trị.

4

MAX_JOIN_SIZE được nhấn khi MySQL tính sản phẩm Descartes của một kết nối, chứ không phải hồ sơ dự kiến ​​thực tế. Vì vậy, nếu bạn đang tham gia một bảng lớn đến một bảng lớn, điều này sẽ leo lên. Sử dụng các chỉ mục và chế độ xem để giảm bớt số lần truy cập bảng có thể xảy ra nếu nó thực sự lớn.

Xem thêm ở đây: MySQL - SQL_BIG_SELECTS