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

Khắc phục Sử dụng ở đâu; Sử dụng tạm thời; Sử dụng filesort

Có vẻ như vì một số lý do, MySQL chọn sử dụng chỉ mục SIL trên bảng đầu tiên và nó sử dụng cả nó để tra cứu (WHERE sil_id = 4601038 ) và phân nhóm (GROUP BY cu.Id ).

Bạn có thể yêu cầu nó sử dụng PK của bảng

SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
    USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id

và nó sẽ tạo ra kế hoạch thực thi này:

id | select_type | table | type  | possible_keys | key     | key_len | ref              | rows | Extra
---+-------------+-------+-------+---------------+---------+---------+------------------+------+-------------
1  | SIMPLE      | cu    | index | PRIMARY       | PRIMARY | 4       | NULL             | 1    | Using where
1  | SIMPLE      | p     | ref   | CatUrl        | CatUrl  | 4       | cbs-test-1.cu.Id | 1    | Using index

Bỏ qua các giá trị được báo cáo trong cột rows ; chúng không đúng vì bảng của tôi trống.

Lưu ý Extra cột bây giờ chỉ chứa Using where nhưng cũng lưu ý rằng tham gia type cột đã thay đổi từ ref (rất tốt) thành index (quét toàn bộ chỉ mục, không khá tốt).

Giải pháp tốt hơn là thêm chỉ mục vào cột SIL_Id . Tôi biết, SIL_Id là tiền tố của chỉ mục SIL(SIL_Id, AsCatId) và về lý thuyết, một chỉ mục khác trên cột SIL_Id là hoàn toàn vô ích. Nhưng có vẻ như nó giải quyết được vấn đề trong trường hợp này.

ALTER TABLE cat_urls
  ADD INDEX (SIL_Id)
;

Bây giờ hãy sử dụng nó trong truy vấn:

SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
    USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id

Kế hoạch thực thi truy vấn hiện có vẻ tốt hơn nhiều:

id | select_type | table | type | possible_keys | key    | key_len | ref              | rows | Extra
---+-------------+-------+------+---------------+--------+---------+------------------+------+-------------
1  | SIMPLE      | cu    | ref  | SIL_Id        | SIL_Id | 4       | const            | 1    | Using where
1  | SIMPLE      | p     | ref  | CatUrl        | CatUrl | 4       | cbs-test-1.cu.Id | 1    | Using index

Hạn chế là chúng ta có thêm một chỉ số (về mặt lý thuyết) là vô dụng. Nó chiếm không gian lưu trữ và nó tiêu thụ các chu kỳ của bộ xử lý mỗi khi một hàng được thêm, xóa hoặc có SIL_Id của nó trường đã sửa đổ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. PHP:mysql v mysqli v pdo

  2. Làm thế nào để CHỌN trên hai bảng?

  3. mysql_exceptions.OperationalError:(1045, Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:CÓ))

  4. Mã lỗi:1055 không tương thích với sql_mode =only_full_group_by

  5. Cách chọn từ tên bảng động