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

Tại sao MySql không tự động tối ưu hóa GIỮA truy vấn?

So sánh như vậy không có ý nghĩa, vì bạn đang so sánh táo với cam.

Hai truy vấn này không giống nhau, chúng đưa ra các giá trị khác nhau,
do đó MySql tối ưu hóa chúng theo một cách khác và kế hoạch của họ có thể khác nhau.

Xem ví dụ đơn giản sau: http:/ /sqlfiddle.com/#!9/98678/2

create table account_range(
  is_active int,
  range_start int,
  range_end int
 );

 insert into account_range values
 (1,-20,100), (1,10,30);

Truy vấn đầu tiên đưa ra 2 hàng:

select * from account_range
 where is_active = 1 and 25 between range_start AND range_end;

| is_active | range_start | range_end |
|-----------|-------------|-----------|
|         1 |         -20 |       100 |
|         1 |          10 |        30 |

Truy vấn thứ hai chỉ cung cấp 1 hàng:

SELECT * FROM account_range
WHERE
    is_active = 1 AND 
    range_start = (SELECT MAX(range_start)
                   FROM account_range
                   WHERE range_start <= 25
    ) AND 
    range_end = (SELECT MIN(range_end)
                 FROM account_range
                 WHERE range_end >= 25
    )

| is_active | range_start | range_end |
|-----------|-------------|-----------|
|         1 |          10 |        30 |

Để tăng tốc truy vấn này (truy vấn đầu tiên), hai chỉ mục bitmap có thể được sử dụng cùng với thao tác "bitmap và" - nhưng MySql không có tính năng như vậy.

Một tùy chọn khác là chỉ mục không gian ( ví dụ:chỉ mục GIN trong PostgreSql: http://www.postgresql. org / docs / current / static / textsearch-indexes.html ).

Và một tùy chọn khác là biến đổi sao (hoặc giản đồ sao) - bạn cần "chia" bảng này thành hai bảng "thứ nguyên" hoặc "số đo" và một bảng "dữ kiện" .. .. nhưng đây là chủ đề quá rộng, nếu bạn muốn biết thêm, bạn có thể bắt đầu từ đây: https:/ /en.wikipedia.org/wiki/Star_schema



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Về Neo4j

  2. MySQL- câu lệnh trường hợp tối ưu hóa

  3. Giá trị trường được tính toán dựa trên cột khác trong khi chèn

  4. Cập nhật bảng từ một bảng khác và cơ sở dữ liệu khác

  5. Java get ResultSet from SQL Array is Failing