Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các giá trị được phân tách bằng dấu phẩy trong mệnh đề MySQL IN

Xây dựng dựa trên ví dụ FIND_IN_SET () từ @Jeremy Smith, bạn có thể làm điều đó với một phép nối để không phải chạy truy vấn con.

SELECT * FROM table t
JOIN locations l ON FIND_IN_SET(t.e_ID, l.city) > 0
WHERE l.e_ID = ?

Điều này được biết là hoạt động rất kém, vì nó phải quét bảng, đánh giá hàm FIND_IN_SET () cho mọi sự kết hợp của các hàng trong tablelocations . Nó không thể sử dụng một chỉ mục và không có cách nào để cải thiện nó.

Tôi biết bạn nói rằng bạn đang cố gắng tận dụng tốt nhất một thiết kế cơ sở dữ liệu tồi, nhưng bạn phải hiểu điều này tồi tệ đến mức nào.

Giải thích:Giả sử tôi yêu cầu bạn tra cứu mọi người trong danh bạ điện thoại có chữ cái đầu tiên, chữ đệm hoặc chữ cái đầu cuối cùng là "J." Không có cách nào để sắp xếp thứ tự của cuốn sách có ích trong trường hợp này, vì bạn vẫn phải quét từng trang.

LIKE giải pháp do @fthiella đưa ra cũng gặp sự cố tương tự liên quan đến hiệu suất. Nó không thể được lập chỉ mục.

Cũng xem câu trả lời của tôi cho Việc lưu trữ danh sách được phân tách trong cột cơ sở dữ liệu có thực sự tệ như vậy không? đối với các cạm bẫy khác của cách lưu trữ dữ liệu không chuẩn hóa này.

Nếu bạn có thể tạo một bảng bổ sung để lưu trữ chỉ mục, bạn có thể ánh xạ vị trí cho từng mục nhập trong danh sách thành phố:

CREATE TABLE location2city (
 location INT,
 city INT,
 PRIMARY KEY (location, city)
); 

Giả sử bạn có một bảng tra cứu cho tất cả các thành phố có thể có (không chỉ những thành phố được đề cập trong bảng table ) bạn có thể chịu sự kém hiệu quả một lần để tạo ánh xạ:

INSERT INTO location2city (location, city)
  SELECT l.e_ID, c.e_ID FROM cities c JOIN locations l
  ON FIND_IN_SET(c.e_ID, l.city) > 0;

Giờ đây, bạn có thể chạy một truy vấn hiệu quả hơn nhiều để tìm các mục nhập trong bảng table của mình :

SELECT * FROM location2city l
JOIN table t ON t.e_ID = l.city
WHERE l.e_ID = ?;

Điều này có thể sử dụng một chỉ mục. Bây giờ bạn chỉ cần quan tâm đến việc CHÈN / CẬP NHẬT / XÓA bất kỳ hàng nào ở các vị trí table cũng chèn các hàng ánh xạ tương ứng trong location2city .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hoạt động của hàm MATCH () trong MySQL

  2. Cách quản lý người dùng và xác thực trong MySQL

  3. Cách khóa một hàng

  4. Làm cách nào để hủy thao tác INSERT trong trình kích hoạt MySql?

  5. Nâng cấp MySQL lên MariaDB 10 (Phần 1 - Cài đặt MariaDB 5.5)