2010-08-07 30 views
10

Tôi có một ứng dụng thương mại điện tử sử dụng MySQL và tôi muốn nó nhanh hơn. Khi một phần # được truy cập trên trang web đã được truy cập trước đó, phần tải nhanh vì tất cả các dữ liệu cần thiết đã có trong vùng đệm INNODB. Tuy nhiên, nếu phần # chưa bao giờ được tải trước đó, dữ liệu đó không nằm trong vùng đệm, vì vậy nó cần phải được đọc từ đĩa, và điều đó là chậm. Tôi thiết lập vùng đệm INNODB của tôi là 2GB, và toàn bộ cơ sở dữ liệu này chỉ khoảng 350MB, vì vậy có rất nhiều chỗ để tải toàn bộ cơ sở dữ liệu trong vùng đệm. Tôi có thể thấy từ số liệu thống kê INNODB chỉ khoảng một nửa vùng đệm được sử dụng ngay bây giờ.Làm thế nào để tải trước bảng vào vùng đệm INNODB với MySQL?

Tôi đã tìm thấy các tham chiếu để tải trước dữ liệu, còn được gọi là "khởi động" vùng đệm, chẳng hạn như Quickly preloading Innodb tables in the buffer pool hoặc mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole .html. Chiến lược về cơ bản liên quan đến việc buộc phải quét bảng trên mỗi bảng vì MySQL không có cách nào để tải trước dữ liệu.

Tôi không muốn tạo thủ công một tập lệnh liệt kê mọi bảng trong cơ sở dữ liệu của tôi và phải thực hiện việc này. Làm cách nào tôi có thể tạo tập lệnh đi qua và tự động chọn cho mỗi bảng và tự động chọn một cột không được lập chỉ mục để thực hiện quét bảng?

Trả lời

0

Truy vấn này sẽ trả lại tên bảng trong cơ sở dữ liệu của bạn, vì vậy bạn không cần phải nhập chúng bằng tay:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

Sau đó, cho mỗi tên bảng hiệu lực bảng quét.

22

này nên cung cấp cho bạn một danh sách các truy vấn để chạy;)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

Bạn có thể đặt nó vào thủ tục lưu trữ, và đi qua resultset với con trỏ. Tạo một câu lệnh đã chuẩn bị từ mỗi hàng và thực thi.

+3

thuật toán này đơn giản và súc tích. Điều này sẽ cache dữ liệu innodb. Tôi không chắc chắn nếu điều này sẽ cache tất cả các trang chỉ mục innodb, nhưng thuật toán của bạn có thể nhanh chóng được áp dụng để làm như vậy. Tôi tin rằng MyISAM chỉ lưu trữ các trang chỉ mục MYI. Một lần nữa, thuật toán của bạn tạo cơ sở để đi qua các bảng và các chỉ mục. Bravo (và +1) !!!! – RolandoMySQLDBA

+1

Mỏ chỉ thực hiện để nhận danh sách truy vấn. Ý tưởng xuất phát từ Blog Hiệu suất Mysql được liên kết trong Câu hỏi. – Mchl

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