2009-02-18 26 views
28

Trước hết, tôi nhận ra sự khác biệt giữa hai:
- Giống như làm sẵn các ký tự đại diện% và _
- đáng kể dấu khoảng trắng
- vấn đề colationSử dụng NHƯ = vs trận đấu chuỗi chính xác

Tất cả điều khác là như nhau, cho một kết hợp chính xác chuỗi đó là hiệu quả hơn:

SELECT field WHERE 'a' = 'a'; 

Hoặc:

SELECT field WHERE 'a' LIKE 'a'; 

Hoặc: Sự khác biệt không đáng kể đến mức không quan trọng?

+4

Baring một hoàn toàn braindead thực hiện, chi phí của một trong hai hương vị của chuỗi so sánh sẽ được dwarfed bởi chi phí di chuyển dữ liệu ra khỏi đĩa. Viết ra những gì bạn thực sự có ý nghĩa và tiếp tục với lập trình. –

+2

Điều này trước đây đã được đề cập [ở đây] (http://stackoverflow.com/questions/543580/equals-vs-like) trên stackoverflow. Tôi hi vọng cái này giúp được. – user34867

+0

Cảm ơn, tôi đã tìm kiếm điều này trước khi đăng nhưng không thấy bằng cách nào đó. – mluebke

Trả lời

29

Tôi sẽ nói rằng trình so sánh = sẽ nhanh hơn. Từ vựng không gửi so sánh với hệ thống từ vựng khác để thực hiện các kết hợp chung. Thay vào đó, động cơ chỉ có thể khớp hoặc di chuyển. Db của chúng tôi tại nơi làm việc có hàng triệu hàng và an = luôn luôn nhanh hơn.

3

Trong một DBMS khá, động cơ DB sẽ nhận ra rằng không có ký tự đại diện trong chuỗi và ngầm biến nó thành một sự bình đẳng thuần túy (không nhất thiết giống như =). Do đó, bạn chỉ nhận được một hiệu suất nhỏ khi bắt đầu, thường không đáng kể cho bất kỳ truy vấn có kích thước nào.

Tuy nhiên, toán tử MySQL = không nhất thiết phải hành động theo cách bạn mong đợi (như kiểm tra bình đẳng thuần túy). Cụ thể, nó không theo mặc định đưa vào không gian tài khoản trailing cho CHARVARCHAR dữ liệu, có nghĩa là:

SELECT age WHERE name = 'pax' 

sẽ cung cấp cho bạn hàng cho 'pax', 'pax<one space>''pax<a hundred spaces>'.

Nếu bạn muốn làm một hợp kiểm tra bình đẳng, bạn sử dụng binary keyword:

SELECT field WHERE name = binary 'pax' 

Bạn có thể kiểm tra điều này với một cái gì đó như:

mysql> create table people (name varchar(10)); 

mysql> insert into people value ('pax'); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('notpax'); 

mysql> select count(*) from people where name like 'pax'; 
1 

mysql> select count(*) from people where name = 'pax'; 
4 

mysql> select count(*) from people where name = binary 'pax'; 
1 
+0

Cập nhật tốt, nhưng phù hợp hơn với câu hỏi này, 'LIKE'" thực hiện khớp trên cơ sở mỗi ký tự ", có nghĩa là động cơ không thể tối ưu' LIKE' thành '=', vì vậy 'LIKE' gần như chắc chắn sẽ chậm hơn. Nó cũng có nghĩa là hai toán tử hoạt động khác nhau tùy thuộc vào đối chiếu, nhưng điều đó ít liên quan hơn cho câu hỏi này. – Flimzy

+0

@Flimzy Bạn có thể xây dựng một chút không? AFAIK, '=' thực hiện so sánh (tất nhiên là không phù hợp) trên cơ sở mỗi ký tự, trừ khi bạn chỉ định 'binary' ở đâu đó. Sự so sánh của – Binarus

+1

@Binarus '=' là khác nhau đối với các ký tự kết hợp, chẳng hạn như 'ä'. Xem [hướng dẫn sử dụng để biết chi tiết] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html). – Flimzy

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