2011-07-26 65 views
6

Chào các nhà phát triển Tôi đang nghiên cứu các cách chọn nhanh các hàng từ nhiều bảng có cấu trúc giống nhau. Bảng có quá nhiều dữ liệu phải là 1 bảng. Vì vậy, mỗi bảng chứa dữ liệu trong 1 tháng. Ví dụ: log_2011_01, log_2011_02 vv Bảng có cột ngày giờ created_at.thủ tục lưu trữ mysql để tìm kiếm từ các bảng giống hệt nhau

Tôi cần tạo quy trình được lưu trữ, nó phải chứa 2 tham số datetime để tìm kiếm giữa ngày này và vài ngày khác.

Bây giờ tôi thấy thực hiện tiếp theo: thủ tục lưu trữ phải tính toán thu thập các bảng giữa 2 ngày và tạo sql để chọn dữ liệu với union_all. Tôi nghĩ rằng tôi sẽ nặng và chưa sẵn sàng cho tải trọng cao phải không? Có khả năng nào khác để thực hiện việc này không? Cảm ơn

+6

Điều này có vẻ như bạn nên sử dụng bảng được phân đoạn thay vì các bảng riêng biệt mỗi tháng. Bạn có biết và bạn có cân nhắc sử dụng phân vùng theo ngày không? – searlea

+1

@Fivell: Chỉ tò mò, có bao nhiêu là "quá nhiều"? –

+0

@ypercube: Tôi không có ý tưởng bao nhiêu nó bây giờ có thể 5-10 GB nhưng kích thước sẽ tăng khoảng 10x thời gian mỗi năm tiếp theo – Fivell

Trả lời

2

Đồng ý với các nhận xét khác, nhưng tôi đã cố gắng trợ giúp bạn với SP. SP này xây dựng truy vấn có thể được thực hiện với prepared statements.

-- SP definition: 

DELIMITER $$ 

CREATE PROCEDURE iterateMonths(IN fromDate DATE, IN toDate DATE) 
BEGIN 
    DECLARE tempDate DATE; 
    DECLARE query VARCHAR(1000); -- Query string, length might be increased 

    SET tempDate = fromDate - INTERVAL (dayofmonth(fromDate) - 1) DAY; 

    WHILE tempDate <= toDate 
    DO 

    IF query IS NOT NULL THEN 
     SET query = concat(query, '\r\nUNION ALL\r\n'); 
    ELSE 
     SET query = ''; 
    END IF; 

    SET query = concat(query, 'SELECT * FROM log_', DATE_FORMAT(tempDate, '%Y_%m')); 
    SET tempDate = tempDate + INTERVAL 1 MONTH; 
    END WHILE; 

    SELECT query; -- Output generated query 
END 
$$ 

DELIMITER ; 

-- Call the SP 

SET @fromDate = '2010-07-29'; 
SET @toDate = '2011-08-29'; 
CALL iterateMonths(@fromDate, @toDate); 

-- Output: 

SELECT * FROM log_2010_07 
UNION ALL 
SELECT * FROM log_2010_08 
UNION ALL 
SELECT * FROM log_2010_09 
UNION ALL 
SELECT * FROM log_2010_10 
UNION ALL 
SELECT * FROM log_2010_11 
UNION ALL 
SELECT * FROM log_2010_12 
UNION ALL 
SELECT * FROM log_2011_01 
UNION ALL 
SELECT * FROM log_2011_02 
UNION ALL 
SELECT * FROM log_2011_03 
UNION ALL 
SELECT * FROM log_2011_04 
UNION ALL 
SELECT * FROM log_2011_05 
UNION ALL 
SELECT * FROM log_2011_06 
UNION ALL 
SELECT * FROM log_2011_07 
UNION ALL 
SELECT * FROM log_2011_08 
+0

SP của tôi đã sẵn sàng từ lâu rồi nhưng nhờ anyway – Fivell

+0

Cảm ơn vì tiền thưởng. – Devart

0

Không thay thế quy trình được lưu trữ tại đây. Highload sẽ ở đó xem xét cấu trúc của các bảng của bạn.

Các vấn đề liên quan