Tôi có một bảng lớn (TokenFrequency) có hàng triệu hàng trong đó. Bảng TokenFrequency được cấu trúc như thế này:SQL Thay thế để thực hiện INNER JOIN trên một bảng đơn
Bảng - TokenFrequency
- id - int, khóa chính
- nguồn - int, ngoại chủ chốt
- thẻ - char
- đếm - int
Mục tiêu của tôi là chọn tất cả các hàng trong đó hai nguồn có cùng mã thông báo trong đó. Ví dụ: nếu bảng của tôi trông như thế này:
id --- nguồn --- mã thông báo --- đếm
1 ------ 1 --------- dog - ----- 1
2 ------ 2 --------- cat -------- 2
3 ------ 3 ----- ---- cat -------- 2
4 ------ 4 --------- lợn -------- 5
5 ---- - 5 --------- sở thú ------- 1
6 ------ 5 --------- cat -------- 1
7 ------ 5 --------- lợn -------- 1
Tôi muốn một truy vấn SQL cung cấp cho tôi nguồn 1, nguồn 2 và tổng số đếm. Ví dụ:
source1 --- source2 --- thẻ --- đếm
---- 2 ----------- 3 --------- mèo -------- 4
---- 2 ----------- 5 --------- cat -------- 3
---- 3 ----------- 5 --------- cat -------- 3
---- 4 ------- ---- 5 --------- -------- lợn 6
tôi có một truy vấn mà trông như thế này:
SELECT F.source AS source1, S.source AS source2, F.token,
(F.count + S.count) AS sum
FROM TokenFrequency F
INNER JOIN TokenFrequency S ON F.token = S.token
WHERE F.source <> S.source
Truy vấn này hoạt động tốt nhưng những vấn đề mà tôi có với nó là rằng:
- Tôi có một bảng TokenFrequency rằng có hàng triệu hàng và do đó cần một sự thay thế nhanh hơn để có được kết quả này.
- Truy vấn hiện tại tôi đang cung cấp cho các bản sao. Ví dụ: lựa chọn của nó:
source1 = 2, source2 = 3, token = cat, count = 4
source1 = 3, source2 = 2, token = cat, count = 4
Đó không phải là quá nhiều của một vấn đề nhưng nếu có một cách để thu hút những người đó và lần lượt có được sự gia tăng tốc độ thì sẽ rất hữu ích
Vấn đề chính mà tôi có là tốc độ truy vấn hiện tại của tôi phải mất hàng giờ để hoàn thành. INNER JOIN trên một bảng để chính nó là những gì tôi tin là vấn đề. Im chắc chắn phải có một cách để loại bỏ phép nối bên trong và nhận được các kết quả tương tự chỉ bằng một cá thể của bảng TokenFrequency. Vấn đề thứ hai mà tôi đã đề cập cũng có thể thúc đẩy tăng tốc độ truy vấn.
Tôi cần một cách để cơ cấu lại truy vấn này để cung cấp cùng một kết quả theo cách nhanh hơn, hiệu quả hơn.
Cảm ơn.
Bạn có thể đăng GIẢI THÍCH truy vấn (http://dev.mysql.com/doc/refman/5.0/en/explain.html) hay không. Nó sẽ giúp mọi người thấy cách họ có thể giúp bạn tối ưu hóa. –
bạn cần cung cấp một số thông tin chỉ mục, cột nào, v.v. –
Đây là GIẢI THÍCH của truy vấn mà tôi đã đăng lần đầu. id: 1, select_type: SIMPLE, bảng: F & S, nhập: ALL, Possible_keys: NULL, Khoá: NULL, Key_len: NULL, ref: NULL, hàng: 8, Thêm: Sử dụng vị trí; Sử dụng bộ đệm nối Có hai hàng trả về sự khác biệt duy nhất là hai tên bảng F và S. – cruzja