Trong InnoDB mọi chỉ mục đều chứa khóa chính một cách ngầm định.
Kế hoạch giải thích cho thấy chỉ mục IDX_NOME
được sử dụng trên bảng Paziente
. DBMS tra cứu tên trong chỉ mục và tìm thấy ID_PAZIENTE
trong đó, đó là chìa khóa chúng ta cần để truy cập bảng kia. Vì vậy, không có gì để thêm vào. (Trong một DBMS khác, chúng tôi đã thêm một chỉ mục tổng hợp trên (NOME, ID_PAZIENTE)
để điều này xảy ra.)
Sau đó là bảng Analisi
cân nhắc. Chúng tôi tìm thấy một bản ghi qua FK_ANALISI_PAZIENTE
chứa ID_PAZIENTE
được sử dụng để tìm kết quả phù hợp và mặc nhiên là khóa chính ID_ANALISI
có thể được sử dụng để truy cập bảng, nhưng điều này thậm chí không cần thiết, vì chúng tôi có tất cả thông tin chúng tôi cần từ chỉ mục. Không có gì còn lại mà chúng ta cần tìm trong bảng. (Một lần nữa, trong một DBMS khác, chúng tôi sẽ thêm một chỉ mục tổng hợp trên (ID_PAZIENTE, ID_ANALISI)
để có một chỉ mục bao trùm.)
Vì vậy, những gì xảy ra chỉ đơn thuần là:đọc một chỉ mục để đọc chỉ mục khác để đếm. Hoàn hảo. Không có gì để thêm.
Chúng tôi có thể thay thế COUNT(analisi0_.ID_ANALISI)
với COUNT(*)
như trước đây chỉ nói "đếm bản ghi trong đó ID_ANALISI
không phải là null ", luôn là trường hợp ID_ANALISI
là khóa chính của bảng. Vì vậy, sẽ đơn giản hơn để sử dụng cái sau và nói "đếm bản ghi". Tuy nhiên, tôi không mong đợi điều này sẽ tăng tốc truy vấn đáng kể nếu có.
Vì vậy, từ quan điểm truy vấn, không có gì để tăng tốc độ này. Dưới đây là những điều khác mà bạn cần lưu ý:
- Các bảng được phân vùng? Không, tôi sẽ không thấy lợi ích gì trong việc này. Có thể nhanh hơn nếu truy vấn được thực hiện trong các chuỗi song song, nhưng theo tôi biết, không có thực thi song song trên nhiều phân vùng trong MySQL. (Tôi có thể sai.)
- Chống phân mảnh các bảng? Không, bản thân các bảng thậm chí không được truy cập trong truy vấn.
- Điều đó khiến chúng ta phải:Mua phần cứng tốt hơn. (Xin lỗi vì không có lời khuyên nào tốt hơn cho bạn.)