Hàm REGEXP
của MySQL rất hữu ích khi bạn cần tìm kiếm các chuỗi văn bản cụ thể trong một cột văn bản, nhưng trên các tập bản ghi lớn, hiệu suất của nó có thể kém hơn mức tuyệt vời
Gần đây, tôi gặp một tình huống tại nơi làm việc mà tôi cần thực hiện tìm kiếm họ/tên trên một trường tên duy nhất. Do thiết kế cơ sở dữ liệu kém, trường tên ở dạng “họ, tên”. Ban đầu, tôi sử dụng REGEXP
để nghĩ ra thứ gì đó như thế này
Select table1.some-data, table2.some-other-data
from
table1, table2
where
table1.name REGEXP "^[ a-z]{0,},[ a-z]{0,}'.$firstName.'[ a-z]{0,}$"
and
table1.name REGEXP "^[ a-z]{0,}'.$lastName.'[ a-z]{0,},[ a-z]{0,}$"
and
table1.key = table2.foreignKey
Thử nghiệm của chúng tôi cho thấy rằng truy vấn này tạo ra kết quả chất lượng tốt cho các tìm kiếm tên, nhưng tôi có cảm giác rằng nó sẽ làm chậm đáng kể máy chủ cơ sở dữ liệu khi tải một chút
Thử nghiệm bằng JMeter đã xác nhận linh cảm này và tôi đã phải đối mặt với nhiệm vụ tối ưu hóa truy vấn mà không ảnh hưởng đến chất lượng của kết quả
phải làm gì?
Nhập hàm LIKE
. Tôi đã sử dụng LIKE
trước đây nhưng không nhận ra nó mạnh [và nhanh] như thế nào. Sau một chút chỉnh sửa, tôi đã đưa ra những điều sau đây
Select table1.some-data, table2.some-other-data
from
table1, table2
where
table1.name LIKE "%,%'.$firstName.'%"
and
table1.name LIKE "%'.$lastName.'%,%"
and
table1.key = table2.foreignKey
Ban đầu, tôi đã [sai lầm] nghĩ rằng các ký tự đại diện của LIKE
["%
" trong truy vấn] chỉ có thể xuất hiện ở đầu hoặc cuối truy vấn, nhưng hóa ra chúng có thể được sử dụng cho tất cả các loại đối sánh mẫu. Truy vấn sử dụng LIKE đưa ra kết quả tương tự như truy vấn sử dụng REGEXP
, chỉ có điều nó nhanh hơn ít nhất 10 lần
Nhược điểm với khớp mẫu của LIKE
[không ảnh hưởng đến truy vấn của tôi] là ký tự đại diện của nó sẽ khớp với bất kỳ ký tự nào, trong khi có thể điều chỉnh REGEXP
bằng cách sử dụng các biểu thức chính quy thông thường để cung cấp khả năng kiểm soát truy vấn chi tiết hơn nhiều
Oracle cung cấp hàm REGEXP_LIKE hỗ trợ cú pháp và hành vi tương tự cho các biểu thức chính quy, nhưng nó phân biệt chữ hoa chữ thường theo mặc định, vì vậy tham số 'i' là bắt buộc để khớp không phân biệt chữ hoa chữ thường
Hàm REGEXP_LIKE[] trong MySQL được sử dụng để so khớp mẫu. Nó so sánh xem các chuỗi đã cho có khớp với biểu thức chính quy hay không. Nó trả về 1 nếu các chuỗi khớp với biểu thức chính quy và trả về 0 nếu không tìm thấy kết quả khớp
cú pháp
Sau đây là cú pháp cơ bản để sử dụng chức năng này trong MySQL
Giải thích thông số
Giải thích về các tham số chức năng REGEXP_LIKE[] là
sự diễn đạt. Đó là một chuỗi đầu vào mà chúng tôi thực hiện tìm kiếm để khớp với biểu thức chính quy
mẫu. Nó đại diện cho biểu thức chính quy mà chúng tôi đang kiểm tra chuỗi
Loại so khớp. Nó là một chuỗi cho phép chúng ta tinh chỉnh biểu thức chính quy. Nó sử dụng các ký tự có thể sau để thực hiện so khớp
- c. Nó đại diện cho một kết hợp phân biệt chữ hoa chữ thường
- i. Nó đại diện cho một kết hợp không phân biệt chữ hoa chữ thường
- m. Nó đại diện cho chế độ nhiều dòng nhận dạng các đầu cuối dòng trong chuỗi. Theo mặc định, hàm này khớp với các dấu kết thúc dòng ở đầu và cuối chuỗi
- n. Nó được sử dụng để sửa đổi các. [dấu chấm] ký tự để khớp với các đầu cuối dòng. Theo mặc định, nó sẽ dừng ở cuối dòng
- u. Nó đại diện cho các kết thúc dòng chỉ dành cho Unix chỉ nhận ra ký tự dòng mới bởi. Toán tử đối sánh , ^ và $
Hãy cho chúng tôi hiểu cách chúng tôi có thể sử dụng chức năng này trong MySQL với các ví dụ khác nhau
Thí dụ
Câu lệnh sau giải thích ví dụ cơ bản về hàm REGEXP_LIKE trong MySQL
Trong ví dụ này, biểu thức chính quy có thể chỉ định bất kỳ ký tự nào thay cho dấu chấm. Vì vậy, chúng tôi sẽ nhận được một trận đấu ở đây. Vì vậy, hàm này trả về 1 để biểu thị kết quả khớp
Câu lệnh dưới đây là một ví dụ khác trong đó chuỗi đầu vào không khớp với biểu thức chính quy đã cho
Đây là đầu ra
Câu lệnh dưới đây là một ví dụ khác trong đó biểu thức chính quy được chỉ định tìm kiếm xem chuỗi có kết thúc bằng các ký tự đã cho hay không
Đây là kết quả
Chúng tôi có thể cung cấp một tham số bổ sung để tinh chỉnh biểu thức chính quy bằng cách sử dụng các đối số loại đối sánh. Xem ví dụ bên dưới nơi chúng tôi đang chỉ định khớp phân biệt chữ hoa chữ thường và chữ hoa chữ thường