2012-04-23 38 views
8

Tôi có truy vấn SQL folowwingMySQL nhóm bởi rất chậm

SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

Các truy vấn được thực hiện trên 11.400.000 hàng và chạy rất chậm. Phải mất hơn 3 phút để thực hiện. Nếu tôi loại bỏ từng phần, điều này chạy dưới 1 giây. Tại sao vậy?

phiên bản MySQL Server là '5.0.21-cộng đồng-nt'

Here is the table schema: 
CREATE TABLE `sales` (
    `ID` int(11) NOT NULL auto_increment, 
    `DocNo` int(11) default '0', 
    `CustomerID` int(11) default '0', 
    `OperatorID` int(11) default '0', 
    PRIMARY KEY (`ID`), 
    KEY `ID` (`ID`), 
    KEY `DocNo` (`DocNo`), 
    KEY `CustomerID` (`CustomerID`), 
    KEY `Date` (`Date`) 
) ENGINE=MyISAM AUTO_INCREMENT=14946509 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
+1

bạn có thể đăng lược đồ bảng (tạo tập lệnh bảng) –

+2

Không chắc chắn liệu bạn có đăng truy vấn thực sự hay không. Nhưng trong truy vấn này, điều gì sẽ là cần thiết để "GROUP BY' nếu không có chức năng nhóm? –

+0

Aziz, tôi cần trả lại giá trị duy nhất của customerID – Treach

Trả lời

17

Hãy thử đặt một chỉ mục trên (ngày, CustomerID).

Hãy nhìn vào hướng dẫn mysql để tối ưu hóa nhóm bằng cách truy vấn: - Group by optimization

Bạn có thể tìm hiểu làm thế nào mysql đang tạo ra kết quả nếu bạn sử dụng EXPLAIN như sau: -

EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

chí này cho bạn biết chỉ mục nào (nếu có) mysql đang sử dụng để tối ưu hóa truy vấn. Điều này rất tiện lợi khi học các chỉ mục nào làm việc cho các truy vấn nào khi bạn có thể thử tạo một chỉ mục và xem liệu mysql có sử dụng nó hay không. Vì vậy, ngay cả khi bạn không hoàn toàn hiểu làm thế nào mysql tính toán các truy vấn tổng hợp, bạn có thể tạo ra một chỉ mục hữu ích bằng thử và sai.

+1

Là một người mới bắt đầu nhận được hang của các truy vấn và bảng tùy chọn, cái nugget nhỏ này là vô giá. Cảm ơn bạn. –

+0

@ArthurGoldsmith Không phải lo lắng :) – rgvcorley

0

Điều này sẽ không nhanh hơn và đạt được kết quả tương tự?

SELECT DISTINCT CustomerID FROM sales WHERE `Date` <= '2012-01-01' 

Đảm bảo đặt chỉ mục trên Date, tất nhiên. Tôi không hoàn toàn chắc chắn nhưng việc lập chỉ mục CustomerID cũng có thể hữu ích.

3

Không biết lược đồ bảng của bạn trông như thế nào, rất khó để chắc chắn, nhưng có thể sẽ hữu ích nếu bạn thêm chỉ mục nhiều cột trên DateCustomerID. Điều đó sẽ tiết kiệm cho MySQL những rắc rối khi thực hiện quét toàn bộ bảng cho câu lệnh GROUP BY. Vì vậy, hãy thử ALTER TABLE sales ADD INDEX (Date,CustomerID).

1

thử này một:

SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01' 
+1

trong mysql riêng biệt chỉ là một trường hợp đặc biệt của một nhóm bởi http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html – cproinger

1

tôi đã cùng một vấn đề, tôi đã thay đổi các lĩnh vực then chốt để các Collation cùng và giúp khắc phục các vấn đề. Các trường để tham gia các bảng có giá trị so sánh khác nhau.