REGEXP so với THÍCH trong MySQL

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

REGEXP so với THÍCH trong MySQL

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

REGEXP so với THÍCH trong MySQL

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ả

REGEXP so với THÍCH trong MySQL

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

Sự khác biệt giữa các toán tử like và REGEXP trong MySQL là gì?

Về cơ bản, LIKE thực hiện các đối sánh ký tự đại diện rất đơn giản và REGEX có khả năng đối sánh các ký tự đại diện rất phức tạp . Trên thực tế, các biểu thức chính quy ( REGEX ) có khả năng đến mức bản thân chúng [1] là cả một nghiên cứu [2] một cách dễ dàng để giới thiệu các lỗi rất tinh vi.

RegEx có nhanh hơn như trong SQL không?

Vâng, có thể sẽ nhanh hơn một chút vì LIKE SQL tiêu chuẩn là một thao tác so sánh đơn giản hơn trình phân tích cú pháp regex đầy đủ. Tuy nhiên, trong điều kiện thực tế, cả hai đều rất chậm, bởi vì cả hai đều không thể sử dụng các chỉ số.

REGEXP_LIKE trong MySQL là gì?

Hàm REGEXP_LIKE() trong MySQL được dùng để 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.

REGEXP_LIKE trong SQL là gì?

REGEXP_LIKE tương tự như điều kiện LIKE, ngoại trừ REGEXP_LIKE thực hiện khớp biểu thức chính quy thay vì khớp mẫu đơn giản được thực hiện bởi LIKE . Điều kiện này đánh giá các chuỗi sử dụng các ký tự như được xác định bởi bộ ký tự đầu vào.