2010-06-11 36 views
7

Tôi hỏi câu hỏi này vì tôi cần biết giới hạn này vì tôi đang tạo truy vấn SELECT trong tập lệnh PHP của mình và một phần của WHERE trong truy vấn này được tạo bên trong vòng lặp.
Chính xác nó trông như thế nàyCó giới hạn về độ dài của truy vấn trong mysql không?

$query="SELECT field_names FROM table_name WHERE "; 
$condition="metadata like \"%$uol_metadata_arr[0]%\" "; 
for($i=1; $i<count($uol_metadata_arr); $i++){ 
    $condition.=" OR metadata like \"%$uol_metadata_arr[$i]%\" "; 
} 
$query.=$condition; 
$result=mysql_query($query); 

Vì vậy, đó là lý do tại sao tôi cần phải biết làm thế nào dài chuỗi $ query của tôi có thể, bởi vì mảng $ uol_metadata_arr có thể chứa nhiều mặt hàng.

+2

Tôi tin rằng mối quan tâm chính của bạn nên là sử dụng nặng 'LIKE' (nó đắt tiền), không phải là _length_ của chuỗi truy vấn * mỗi lần * :) – jensgram

+0

Mọi đề xuất thay thế LIKE thành cái gì khác? – Bakhtiyor

+1

chỉ mục FULLTEXT có thể phù hợp. –

Trả lời

13
  1. (nếu có thể) Sử dụng WHERE metadata IN ('value1', 'value2')
  2. Bạn có thể cần phải tăng max_allowed_packet. Giá trị mặc định là 16MB (phía máy khách và thấp hơn 1MB phía máy chủ trong phiên bản cũ) và không khó để xây dựng truy vấn chạy ngược lại giới hạn đó (ví dụ: nhập dữ liệu từ nơi khác với truy vấn INSERT khổng lồ)

LIKE '%string%' là sát thủ hiệu suất. Truy vấn như vậy không thể sử dụng chỉ mục trên cột đó. LIKE 'string%' mặt khác, is indexable

+0

nhưng ở đâu siêu dữ liệu trong ('value1' , 'value2') chỉ truy lục khi siêu dữ liệu chính xác bằng giá trị 1 hoặc giá trị2. Trong trường hợp của tôi, tôi cần phải lấy các metadatas tương tự, tức là tôi cần phải xem xét rằng 'sql' và 'mysql' là các chuỗi bằng nhau. – Bakhtiyor

+1

'WHERE siêu dữ liệu IN ('value1', 'value2')' sẽ không làm điều tương tự như ông đề cập. Nó sẽ không nhìn xem liệu 'giá trị' có nằm trong siêu dữ liệu hay không, nhưng thay vào đó sẽ đi qua từng giá trị trong danh sách ('value1', 'value2') để xem liệu có mục nào khớp chính xác với siêu dữ liệu hay không. Tuy nhiên, OP chắc chắn sẽ muốn kiểm tra 'max_allowed_packet' như đã đề cập nếu có liên quan đến hàng chục điều khoản. – Joseph

+0

indexable == sargable –

5

Xem biến số toàn cầu max_allowed_packet. Bạn sẽ cần truy cập vào tệp my.cnf để điều chỉnh nó (và cũng cần điều chỉnh nó trên máy khách của bạn). Các giá trị mặc định điển hình là 1mb hoặc 16mb ...

Các vấn đề liên quan