2010-02-01 11 views
17

Tôi đang thực hiện truy vấn "chọn tổng (foo) từ thanh" trên cơ sở dữ liệu MySQL tổng hợp các bản ghi 7.3mm và mất khoảng 22 giây cho mỗi lần chạy. Có một thủ thuật để tăng tốc các khoản tiền trong MySQL?Có thể tăng tốc độ tổng() trong MySQL không?

+0

Nó có thể cơ sở dữ liệu khác mặc dù; ví dụ [Oracle] (http://en.wikipedia.org/wiki/Materialized_view), [MS SQL] (http://technet.microsoft.com/library/Cc917715), –

Trả lời

24

Không, bạn không thể tăng tốc độ bản thân chức năng. Vấn đề ở đây thực sự là bạn đang chọn 7,3 triệu bản ghi. MySQL phải quét toàn bộ bảng và 7,3 triệu là một con số khá lớn. Tôi ấn tượng rằng nó kết thúc nhanh chóng, thực sự.

Chiến lược bạn có thể sử dụng sẽ là chia dữ liệu thành các tập con nhỏ hơn (có thể theo ngày? Tháng?) Và duy trì tổng số cho dữ liệu cũ sẽ không thay đổi. Bạn có thể cập nhật định kỳ tổng và giá trị tổng thể có thể được tính bằng cách thêm tổng và bất kỳ dữ liệu mới nào được thêm vào kể từ đó, sẽ là số lượng hàng nhỏ hơn nhiều.

3

Không, không thực sự. Nó sẽ luôn luôn phải liệt kê tất cả các hàng trong bảng.

Bạn có thể tạo bảng bổ sung và cập nhật số tiền trong đó trên mỗi lần chèn, cập nhật, xóa?

0

Nếu truy vấn của bạn thực sự là đơn giản, không ... nhưng nếu bạn đang sử dụng một truy vấn phức tạp hơn (và viết tắt nó ở đây), bạn có thể (có lẽ) - như sử dụng tốt hơn tham gia ...

9

Bật trên QUERY CACHE trong mysql. Caching được TẮT theo mặc định. Bạn cần phải đặt tập tin mysql ini.

-- hint mysql server about caching 
SELECT SQL_CACHE sum(foo) FROM bar; 

Trình tối ưu hóa MySQL có thể trả về bộ nhớ cache nếu không có thay đổi nào được thực hiện cho bảng.

đọc thêm ở đây: http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

+0

Liệu giá trị được lưu trong bộ nhớ cache có được cập nhật khi giá trị không của 'foo' được cập nhật? Hoặc MySQL sẽ chỉ tổng hợp lại toàn bộ bảng lần sau khi truy vấn này được chạy? –

+1

@ BlueRaja-DannyPflughoeft bộ nhớ cache sẽ bị xóa và sẽ tổng hợp lại toàn bộ bảng. –

1

Bạn có lẽ có thể thử thêm một chỉ số trên sân bar.foo. Chỉ mục sẽ chứa tất cả các giá trị của cột thanh, nhưng nhỏ hơn do đó nhanh hơn để quét hơn bảng foo gốc, đặc biệt nếu foo có nhiều cột khác.

+0

lỗi cố định khi đề cập đến cột. nên là bar.foo, không phải foo.bar. nhờ @ harry-b – hongliang

8

Hai điều ở đây:

1) Bạn không nên làm tiền cho 7.3m hồ sơ trên cơ sở thường xuyên - giới thiệu bảng dàn phục vụ nhu cầu kinh doanh (theo ngày, tháng, năm, bộ phận, vv) và điền chúng trên cơ sở dự kiến, có thể tái sử dụng những bảng thay vì ban đầu bảng 'thô' (như chọn giá trị tóm tắt cho mỗi ngày khi bạn cần vài ngày khoảng vv)

2) kiểm tra giao dịch của bạn cài đặt

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read