2011-09-21 35 views
20

Có ai biết cái nào là nhanh hơn:MySQL NHƯ vs VỊ

SELECT * FROM table WHERE column LIKE '%text%'; 

hoặc

SELECT * FROM table WHERE LOCATE('text',column)>0; 
+0

Tại sao không đo điểm chuẩn/cấu hình này và tìm hiểu? – marto

+0

@matro: điểm chuẩn/hồ sơ là gì. Cho enthu – Gowri

+3

Giống như sẽ nhanh hơn. Chỉ mục toàn văn và 'đối sánh với' sẽ nhanh hơn nhiều. – Johan

Trả lời

21

Added 20 tháng 4 năm 2015: Vui lòng đọc cũng Hallie's answer dưới


Đầu tiên nhưng nhẹ. Chủ yếu là vì nó không phải làm thêm so sánh > 0.

mysql> SELECT BENCHMARK(100000000,LOCATE('foo','foobar')); 
+---------------------------------------------+ 
| BENCHMARK(100000000,LOCATE('foo','foobar')) | 
+---------------------------------------------+ 
|           0 | 
+---------------------------------------------+ 
1 row in set (3.24 sec) 

mysql> SELECT BENCHMARK(100000000,LOCATE('foo','foobar') > 0); 
+-------------------------------------------------+ 
| BENCHMARK(100000000,LOCATE('foo','foobar') > 0) | 
+-------------------------------------------------+ 
|            0 | 
+-------------------------------------------------+ 
1 row in set (4.63 sec) 


mysql> SELECT BENCHMARK(100000000,'foobar' LIKE '%foo%'); 
+--------------------------------------------+ 
| BENCHMARK(100000000,'foobar' LIKE '%foo%') | 
+--------------------------------------------+ 
|           0 | 
+--------------------------------------------+ 
1 row in set (4.28 sec) 


mysql> SELECT @@version; 
+----------------------+ 
| @@version   | 
+----------------------+ 
| 5.1.36-community-log | 
+----------------------+ 
1 row in set (0.01 sec) 
+0

'benchmark' hoạt động như thế nào, Độ chính xác của những con số này là bao nhiêu? – Pacerier

+0

'BENCHAMRK' chỉ đơn giản là chạy biểu thức được cung cấp một số lần nhất định. https://dev.mysql.com/doc/refman/5.5/en/select-benchmarking.html Về tính chính xác, tôi thực sự không thể nói cho bạn biết nhiều. Tôi thấy nó khá tốt khi nói đến độ chính xác. – Mchl

4

Tôi đã làm một số xét nghiệm như Mchi đã làm.Và tôi nghĩ thật khó để nói cái nào nhanh hơn. Dường như tùy thuộc vào lần xuất hiện đầu tiên của chuỗi con.

mysql> select benchmark(100000000, 'afoobar' like '%foo%'); 
+----------------------------------------------+ 
| benchmark(100000000, 'afoobar' like '%foo%') | 
+----------------------------------------------+ 
|           0 | 
+----------------------------------------------+ 
1 row in set (9.80 sec) 

mysql> select benchmark(100000000, locate('foo', 'afoobar')); 
+------------------------------------------------+ 
| benchmark(100000000, locate('foo', 'afoobar')) | 
+------------------------------------------------+ 
|            0 | 
+------------------------------------------------+ 
1 row in set (8.08 sec) 

mysql> select benchmark(100000000, 'abfoobar' like '%foo%'); 
+-----------------------------------------------+ 
| benchmark(100000000, 'abfoobar' like '%foo%') | 
+-----------------------------------------------+ 
|            0 | 
+-----------------------------------------------+ 
1 row in set (10.55 sec) 

mysql> select benchmark(100000000, locate('foo', 'abfoobar')); 
+-------------------------------------------------+ 
| benchmark(100000000, locate('foo', 'abfoobar')) | 
+-------------------------------------------------+ 
|            0 | 
+-------------------------------------------------+ 
1 row in set (10.63 sec) 

mysql> select benchmark(100000000, 'abcfoobar' like '%foo%'); 
+------------------------------------------------+ 
| benchmark(100000000, 'abcfoobar' like '%foo%') | 
+------------------------------------------------+ 
|            0 | 
+------------------------------------------------+ 
1 row in set (11.54 sec) 

mysql> select benchmark(100000000, locate('foo', 'abcfoobar')); 
+--------------------------------------------------+ 
| benchmark(100000000, locate('foo', 'abcfoobar')) | 
+--------------------------------------------------+ 
|            0 | 
+--------------------------------------------------+ 
1 row in set (12.48 sec) 

mysql> select @@version; 
+------------+ 
| @@version | 
+------------+ 
| 5.5.27-log | 
+------------+ 
1 row in set (0.01 sec) 
+0

Bắt tốt! Tôi chưa nghĩ đến việc thử nghiệm điều đó! – Mchl

5

+1 to @Mchl để trả lời câu hỏi trực tiếp nhất.

Nhưng chúng ta nên nhớ rằng không phải giải pháp nào có thể sử dụng chỉ mục, vì vậy chúng bị ràng buộc thực hiện quét bảng.

Cố gắng quyết định giữa băng vải hoặc băng dính nhựa là loại ngớ ngẩn, khi bạn đang cố gắng vá vỏ tàu Titanic.

Đối với loại truy vấn này, một truy vấn cần full-text search index. Tùy thuộc vào kích thước của bảng, điều này sẽ là hundreds or thousands of times faster.

+2

Vấn đề với toàn văn trong MySQL là nó hiện không có khả năng tìm kiếm ký tự đại diện, chỉ tìm kiếm tiền tố ('foo *' sẽ khớp 'foobar', nhưng' * bar' sẽ không). – Itai

+1

Apache Lucene và Solr có cùng giới hạn. Tìm kiếm nhân sư hỗ trợ lập chỉ mục infix, vì vậy bạn có thể đặt ký tự đại diện ở đầu mẫu. Xem http://sphinxsearch.com/docs/current/conf-min-infix-len.html –