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

Tốc độ của từ khóa IN trong MySQL / PostgreSQL

Trong PostgreSQL, chính xác những gì bạn sẽ nhận được ở đây phụ thuộc vào bảng bên dưới, vì vậy bạn nên sử dụng PHÂN TÍCH GIẢI THÍCH trên một số truy vấn mẫu dựa trên một tập hợp con hữu ích của dữ liệu của bạn để tìm ra chính xác những gì trình tối ưu hóa sẽ làm (đảm bảo các bảng bạn đang chạy chống lại cũng đã được ANALYZEd). IN có thể được xử lý theo một số cách khác nhau và đó là lý do tại sao bạn cần xem xét một số mẫu để tìm ra phương pháp thay thế nào đang được sử dụng cho dữ liệu của mình. Không có câu trả lời chung chung đơn giản cho câu hỏi của bạn.

Đối với câu hỏi cụ thể mà bạn đã thêm trong bản sửa đổi của mình, dựa trên một tập dữ liệu tầm thường không có chỉ mục nào liên quan, đây là ví dụ về hai kế hoạch truy vấn mà bạn sẽ nhận được:

postgres=# explain analyze select * from x where s in ('123','456');
 Seq Scan on x  (cost=0.00..84994.69 rows=263271 width=181) (actual time=0.015..1819.702 rows=247823 loops=1)
   Filter: (s = ANY ('{123,456}'::bpchar[]))
 Total runtime: 1931.370 ms

postgres=# explain analyze select * from x where s='123' or s='456';
 Seq Scan on x  (cost=0.00..90163.62 rows=263271 width=181) (actual time=0.014..1835.944 rows=247823 loops=1)
   Filter: ((s = '123'::bpchar) OR (s = '456'::bpchar))
 Total runtime: 1949.478 ms

Hai thời gian chạy đó về cơ bản giống hệt nhau, bởi vì thời gian xử lý thực bị chi phối bởi quá trình quét tuần tự trên bảng; chạy nhiều lần cho thấy sự khác biệt giữa hai là dưới biên độ lỗi chạy để chạy. Như bạn có thể thấy, PostgreSQL chuyển trường hợp IN thành sử dụng bộ lọc BẤT KỲ, bộ lọc này sẽ luôn thực thi nhanh hơn một loạt các OR. Một lần nữa, trường hợp nhỏ này không nhất thiết phải đại diện cho những gì bạn sẽ thấy trên một truy vấn nghiêm túc có liên quan đến các chỉ mục và những thứ tương tự. Bất chấp việc thay thế IN theo cách thủ công bằng một loạt câu lệnh OR sẽ không bao giờ nhanh hơn, bởi vì trình tối ưu hóa biết điều tốt nhất cần làm ở đây nếu nó có dữ liệu tốt để làm việc.

Nói chung, PostgreSQL biết nhiều thủ thuật hơn để tối ưu hóa các truy vấn phức tạp hơn so với trình tối ưu hóa MySQL, nhưng nó cũng phụ thuộc rất nhiều vào việc bạn đã cung cấp cho trình tối ưu hóa đủ dữ liệu để hoạt động. Các liên kết đầu tiên trên phần "Tối ưu hóa Hiệu suất" của wiki PostgreSQL bao gồm những điều quan trọng nhất cần thiết để có được kết quả tốt từ trình tối ưu hóa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Lấy các cột theo mức độ ưu tiên Giá trị

  2. PDO và MySQL 'giữa'

  3. Làm cách nào để tôi có thể tự động chuyển đổi MySQL DDL sang Oracle DDL?

  4. MYSQL:Làm thế nào để tìm player_id từ họ?

  5. Các truy vấn MySQL phổ biến nhất