2011-11-11 41 views
6

Tôi đang sử dụng ứng dụng django thực hiện một số thao tác ORM 'bắt đầu' so sánh các cột longtext với chuỗi unicode. Điều này dẫn đến hoạt động so sánh LIKE BINARY với chuỗi unicode u'mystring'. Là một NHƯ BẬY NHƯ THẾ NÀO có khả năng chậm hơn so với một LIKE đơn giản?SQL 'LIKE BINARY' chậm hơn so với đồng bằng 'LIKE'?

Tôi biết câu trả lời chung là điểm chuẩn, nhưng tôi muốn có được một ý tưởng chung cho cơ sở dữ liệu nói chung chứ không chỉ là ứng dụng của tôi vì tôi chưa bao giờ thấy một truy vấn NHẬY NHƯ LIKE trước đây.

Tôi tình cờ sử dụng MySQL nhưng tôi quan tâm đến câu trả lời cho cơ sở dữ liệu SQL nói chung.

Trả lời

5

Nếu hiệu suất dường như trở thành một vấn đề, nó có thể là một ý tưởng hay để tạo bản sao của ví dụ đầu tiên. 255 ký tự của văn bản dài, thêm chỉ mục trên đó và sử dụng startswith với điều đó.

BTW, this page says: "nếu bạn cần thực hiện đối sánh phân biệt chữ hoa chữ thường, hãy khai báo cột của bạn là BINARY; không sử dụng NHƯ BINARY trong truy vấn của bạn để đúc cột không nhị phân. Nếu bạn làm như vậy, MySQL sẽ không sử dụng bất kỳ chỉ mục nào trên cột đó. " Đó là một mẹo cũ nhưng tôi nghĩ rằng điều này vẫn còn hợp lệ.

+1

xác nhận hành vi này trong mysql 5.5.31. Đối với django, điều này có nghĩa điều quan trọng là sử dụng __istartswith thay vì __startswith cho hiệu năng tốt. – Julian

2

Đối với người kế tiếp dám chạy ngang này - trong cơ sở dữ liệu tương đối nhỏ của chúng tôi truy vấn:

SELECT * FROM table_name WHERE field LIKE 'some-field-search-value'; 

... Result row 

Returns 1 row in set (0.00 sec) 

So với:

SELECT * FROM table_name WHERE field LIKE BINARY 'some-field-search-value'; 

... Result row 

Returns 1 row in set (0.32 sec) 

câu chuyện dài ngắn, ít nhất là cho cơ sở dữ liệu của chúng tôi (MySQL 5,5/InnoDB) có sự khác biệt rất lớn về hiệu suất giữa hai lần tra cứu.

Rõ ràng dù đây là một lỗi trong MySQL 5.5: http://bugs.mysql.com/bug.php?id=63563 và trong thử nghiệm của tôi chống lại cơ sở dữ liệu tương tự trong MySQL 5.1 truy vấn nhị phân như vẫn sử dụng chỉ số (trong khi ở 5,5 nó một bảng đầy đủ quét.)