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

Lập chỉ mục chính xác khi sử dụng toán tử OR

Bạn hiểu sai về cách hoạt động của các chỉ mục.

Hãy nghĩ đến một danh bạ điện thoại (tương đương với một chỉ mục hai cột về họ và tên). Nếu tôi yêu cầu bạn tìm tất cả những người trong danh bạ điện thoại có họ là "Smith", bạn có thể hưởng lợi từ thực tế là các tên được sắp xếp theo cách đó; bạn có thể giả định rằng các Smith được tổ chức cùng nhau. Nhưng nếu tôi yêu cầu bạn tìm tất cả những người có tên đầu tiên là "John", bạn sẽ không nhận được lợi ích nào từ chỉ mục. Johns có thể có bất kỳ họ nào, và vì vậy chúng nằm rải rác khắp cuốn sách và cuối cùng bạn sẽ phải tìm kiếm một cách khó khăn, từ đầu này đến trang khác.

Bây giờ nếu tôi yêu cầu bạn tìm tất cả những người có họ là "Smith" HOẶC có tên là "John", bạn có thể dễ dàng tìm thấy Smith như trước đây, nhưng điều đó không giúp bạn tìm được Johns. Chúng vẫn nằm rải rác khắp cuốn sách và bạn phải tìm kiếm chúng một cách khó khăn.

Điều này cũng tương tự với các chỉ mục nhiều cột trong SQL. Chỉ mục được sắp xếp theo cột đầu tiên, sau đó được sắp xếp theo cột thứ hai trong trường hợp quan hệ ở cột đầu tiên, sau đó được sắp xếp theo cột thứ ba trong trường hợp quan hệ ở cả hai cột đầu tiên, v.v. Nó không được sắp xếp theo tất cả các cột đồng thời. Vì vậy, chỉ mục nhiều cột của bạn không giúp làm cho các cụm từ tìm kiếm của bạn hiệu quả hơn, ngoại trừ cột ngoài cùng bên trái trong chỉ mục.

Quay lại câu hỏi ban đầu của bạn.

Tạo một chỉ mục cột đơn riêng biệt trên mỗi cột. Một trong những chỉ mục này sẽ là lựa chọn tốt hơn những chỉ mục khác, dựa trên ước tính có bao nhiêu hoạt động I / O chỉ số sẽ phải chịu nếu nó được sử dụng.

Các phiên bản hiện đại của MySQL cũng có một số thông minh về hợp nhất chỉ mục , vì vậy truy vấn có thể sử dụng nhiều hơn một chỉ mục trong một bảng nhất định, sau đó cố gắng hợp nhất các kết quả. Nếu không, MySQL có xu hướng bị hạn chế sử dụng một chỉ mục cho mỗi bảng trong một truy vấn nhất định.

Một thủ thuật khác mà nhiều người sử dụng thành công là thực hiện một truy vấn riêng biệt cho từng cột được lập chỉ mục của bạn (nên sử dụng chỉ mục tương ứng) và sau đó là UNION kết quả.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Một nhận xét cuối cùng:nếu bạn thấy mình đang tìm kiếm cùng một 'something' trên bốn trường, bạn nên xem xét lại nếu cả bốn trường thực sự giống nhau và bạn có tội khi thiết kế một bảng vi phạm Biểu mẫu Bình thường Đầu tiên với các nhóm lặp lại . Nếu vậy, có lẽ field1 đến field4 thuộc về một cột duy nhất trong bảng con. Sau đó, việc lập chỉ mục và truy vấn trở nên dễ dàng hơn rất nhiều:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Triển khai MySQL Server + DB với ứng dụng .Net

  2. Làm cách nào để ngăn vượt quá max_user_connections khi tải lại / làm mới trang nhiều lần?

  3. Cài đặt mysqldb trên Snow Leopard

  4. Các hàng được chọn ngẫu nhiên qua JPA

  5. Cách lấy nhiều hàng từ cơ sở dữ liệu trong PHP