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

MySQL:chỉ mục tổng hợp fulltext + btree?

Sử dụng IN BOOLEAN MODE .

Chỉ mục ngày không hữu ích. Không có cách nào để kết hợp hai chỉ mục.

Hãy lưu ý, nếu người dùng tìm kiếm thứ gì đó hiển thị trong 30 nghìn hàng, truy vấn sẽ chậm. Không có gì đơn giản xung quanh nó.

Tôi nghi ngờ bạn có TEXT cột trong bảng? Có như vậy thì mới có hy vọng. Thay vì làm SELECT * một cách mù quáng , trước tiên hãy tìm id và lấy LIMIT đã áp dụng, sau đó thực hiện * .

SELECT a.* 
    FROM tbl AS a
    JOIN ( SELECT date, id
             FROM tbl
             WHERE MATCH(...) AGAINST (...)
             ORDER BY date DESC
             LIMIT 10 ) AS x
        USING(date, id)
    ORDER BY date DESC;

Cùng với

PRIMARY KEY(date, id),
INDEX(id),
FULLTEXT(...)

Công thức và lập chỉ mục này sẽ hoạt động như sau:

  1. Sử dụng FULLTEXT để tìm 30 nghìn hàng, phân phối PK.
  2. Với PK, sắp xếp 30K hàng theo date .
  3. Chọn 10 cuối cùng, gửi date, id
  4. Quay lại bàn 10 lần bằng PK.
  5. Sắp xếp lại. (Vâng, điều này là cần thiết.)

Thêm (Trả lời rất nhiều Bình luận):

Mục tiêu đằng sau việc định dạng lại của tôi là tránh tìm nạp tất cả cột của 30K hàng. Thay vào đó, nó chỉ tìm nạp PRIMARY KEY , sau đó giảm khoảng cách đó xuống 10, sau đó tìm nạp * chỉ có 10 hàng. Ít thứ hơn nhiều.

Liên quan đến COUNT trên bảng InnoDB:

  • INDEX (col) làm cho nó trở thành một chỉ mục quét hoạt động cho SELECT COUNT(*) hoặc SELECT COUNT(col) không có WHERE .
  • Không có INDEX(col), SELECT COUNT (*) will use the "smallest" index; but SELECT COUNT (col) `sẽ cần một bảng quét.
  • Quét bảng là thường chậm hơn quét chỉ mục.
  • Cẩn thận về thời gian - Nó bị ảnh hưởng đáng kể bởi liệu chỉ mục và / hoặc bảng đã được lưu vào bộ nhớ cache trong RAM hay chưa.

Một điều khác về FULLTEXT+ ở phía trước của các từ - để nói rằng mỗi từ phải tồn tại, khác không có sự phù hợp. Điều này có thể cắt giảm 30 nghìn.

FULLTEXT chỉ mục sẽ cung cấp date, id là thứ tự ngẫu nhiên, không phải thứ tự PK. Dù sao, việc cho rằng bất kỳ thứ tự nào là 'sai', do đó, việc thêm ORDER BY là 'đúng' , sau đó hãy để Trình tối ưu hóa ném nó nếu nó biết rằng nó là thừa. Và đôi khi Trình tối ưu hóa có thể tận dụng ORDER BY (không phải trong trường hợp của bạn).

Chỉ xóa ORDER BY , trong nhiều trường hợp, làm cho một truy vấn chạy nhanh hơn nhiều. Điều này là do nó tránh tìm nạp, chẳng hạn như 30K hàng và sắp xếp chúng. Thay vào đó, nó chỉ phân phối 10 hàng "bất kỳ".

(Tôi chưa có kinh nghiệm với Postgres, vì vậy tôi không thể giải quyết câu hỏi đó.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hành vi 'chọn để cập nhật' của MySQL

  2. MYSQL đặt múi giờ trong mã PHP

  3. Phương thức xác thực 'mysql_old_password' không được hỗ trợ

  4. mySQL select IN range

  5. Tôi có thể thay thế mù quáng tất cả các hàm mysql_ bằng mysqli_ không?