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

Cách tối ưu hóa truy vấn đơn giản Mysql này

OR các điều kiện khi không nằm trên cùng một trường hoặc dựa trên phạm vi (chẳng hạn như < , > , LIKE ) thực sự làm giảm khả năng của MySQL để tận dụng các chỉ mục; bạn có thể cấu trúc lại các truy vấn bằng cách chia nhỏ chúng thành các truy vấn riêng biệt đơn giản hơn mà bạn có thể UNION. Việc tách nó ra như vậy cho phép MySQL tận dụng chỉ mục khác nhau của mỗi truy vấn trong UNIONs

SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`user_id` = 'search_term' 
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`lname` LIKE 'search_term%'    
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`email` LIKE 'search_term%'
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` INNER JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `c`.`company` LIKE 'search_termeo%'
;

Ngoài ra, hãy lưu ý rằng tôi đã thay đổi JOIN cuối cùng thành INNER vì bất kỳ điều kiện nào trên bảng bên phải của LEFT JOIN (không phải là "không có khớp từ bảng đó") về cơ bản vẫn là INNER JOIN.

UNION DISTINCT được sử dụng để ngăn các bản ghi thỏa mãn nhiều điều kiện bị lặp lại, tuy nhiên ... if companies.company không phải là duy nhất (tức là id công ty 1 được gọi là "Blah" và id công ty 12 cũng được gọi là "Blah") thì những thứ đó cũng sẽ được hợp nhất khi chúng không có trong truy vấn ban đầu của bạn; nếu đó là một vấn đề tiềm ẩn, có thể được khắc phục bằng cách bao gồm cả company_id trong mỗi SELECT .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tìm các ký tự không phải ASCII trong MySQL?

  2. Cách cài đặt và cấu hình MySQL trên Ubuntu

  3. MySQL - Ràng buộc khóa ngoại có điều kiện

  4. MySQL DATEDIFF () so với TIMEDIFF ():Sự khác biệt là gì?

  5. Thực thi truy vấn thô trên MySQL Loopback Connector