Bộ nhớ cache cơ sở dữ liệu MySQL trong bộ nhớ


11

Tôi đang gặp vấn đề với một trang web có cơ sở dữ liệu MySQL 600MB. Trang web quá chậm. Tôi nhận thấy cơ sở dữ liệu MySQL càng lớn thì càng chậm. Khi còn 5 MB, trang web rất nhanh. Khi nó bắt đầu lớn hơn, nó bắt đầu trở nên chậm hơn và chậm hơn và bây giờ, ở mức 600MB, nó thực sự rất chậm, mất 10 giây để tải trang.

Tôi đã kiểm tra các quy trình hàng đầu và nó không có gì liên quan đến tải cao hoặc bất cứ điều gì. Nó thậm chí không liên quan đến IOPS khi tôi đã thử nghiệm trên các ổ đĩa cứng 7.2k vòng / phút và bây giờ cũng gặp vấn đề tương tự với việc kiểm tra các ổ SSD Intel 320, vì vậy tôi cũng không nghĩ đó là về các truy vấn cao.

Trang web đang sử dụng Wordpress và có 9 plugin hoạt động. Mọi người nói đó có thể là plugin ... cũng có thể ... nhưng hiện tại tôi chỉ muốn lưu trữ toàn bộ cơ sở dữ liệu trong bộ nhớ và muốn nhận trợ giúp cũng như hướng dẫn về nơi bắt đầu và cách thực hiện.

Tôi có 16GB RAM và i5-2400 4 lõi @ 3.1 GHz. Hệ điều hành là centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached

Câu trả lời:


10

Nếu tôi là bạn, tôi sẽ chuyển tất cả dữ liệu sang InnoDB. Khóa bảng / khóa hàng đã được thảo luận bởi nhiều người. Tôi sẽ luôn chọn InnoDB. Tuy nhiên, có một lý do sâu sắc khác để chọn InnoDB ... CÁCH MẠNG .

Mặc dù hầu hết mọi người đều tự hào rằng MyISAM nhanh hơn để đọc, nhưng hầu hết mọi người đều quên rằng nhiều bộ đệm cho MyISAM, được gọi là bộ đệm chính (được đặt bởi key_buffer_size), chỉ lưu trữ các trang chỉ mục từ các tệp .MYI. Nó không bao giờ lưu trữ các trang dữ liệu. Nó có tối đa chính thức 4GB trong Hệ thống 32 bit. 8GB là tối đa tốt nhất cho 64-bit.

Nhóm đệm InnoDB lưu trữ dữ liệu và các trang chỉ mục. Tùy thuộc vào máy chủ mà bạn có, bạn có thể lưu trữ tối đa toàn bộ dữ liệu trong RAM. Bạn có thể điều chỉnh InnoDB cho tối đa 80% RAM và 10% cho DB Conenctions và để lại 10% cho HĐH. Điều này đúng ngay cả đối với các hệ điều hành khác nhau .

Tôi đã khuyến nghị những điều này cho khách hàng của Drupal với thành công tuyệt vời. Nó cũng áp dụng cho Wordpress . Tôi đã cung cấp hỗ trợ DB cho khách hàng với WordPress. Cải tiến tương tự.

Bạn luôn có thể định cấu hình bộ nhớ cho InnoDB hiệu quả hơn để bạn có thể MyISAM nhiều hơn. Luôn luôn có một cách để tweek InnoDB phù hợp với nhu cầu hiệu suất của bạn . Khi dữ liệu của bạn phát triển, cuối cùng nó sẽ trở thành một yêu cầu .

CẬP NHẬT 2011-11-21 11:44 EST

Nếu tập dữ liệu hoàn chỉnh của bạn đủ nhỏ, bạn có thể thực hiện truy vấn CHỌN trên mỗi bảng bạn có ngay sau khi mysql khởi động.

Đối với tất cả các bảng là InnoDB và / hoặc MyISAM, hãy chạy truy vấn này:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

Điều này sẽ xuất ra mọi truy vấn CHỌN có thể bạn cần chạy để triệu tập tất cả các chỉ mục sẽ được tham chiếu. Đặt truy vấn này trong một tệp có tên /root/MakeSelectQueriesToLoad.sql. Chạy tập lệnh và thu thập đầu ra /root/SelectQueriesToLoad.sql. Cuối cùng, chạy nó:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

Điều này chắc chắn sẽ tải trước tất cả các trang chỉ mục vào Bộ đệm InnoDB và Bộ đệm ẩn MyISAM. Nếu tất cả dữ liệu của bạn là InnoDB, hãy thực hiện hai thay đổi:

  • thay thế WHERE engine IN ('InnoDB','MyISAM')bằngWHERE engine='InnoDB'
  • thay thế CONCAT('SELECT ',ndxcollist,' FROM ',bằngCONCAT('SELECT * FROM ',

Điều này cũng sẽ đưa nhiều trang dữ liệu vào Nhóm đệm InnoDB.

LƯU Ý CUỐI CÙNG: Đảm bảo rằng Bộ đệm InnoDB đủ lớn để chứa tất cả Dữ liệu InnoDB của bạn


2

Bạn đã lưu trữ toàn bộ cơ sở dữ liệu trong bộ nhớ. Vấn đề gần như chắc chắn là thời gian cần thiết để tìm kiếm cơ sở dữ liệu, ngay cả trong RAM.

Xem số liệu thống kê I / O đĩa của bạn. Bạn có thể sẽ thấy rằng chỉ có một chút I / O ngẫu nhiên của đĩa. Cơ sở dữ liệu nằm trong bộ nhớ. Đó không phải là vấn đề. Bạn cần cài đặt iostattrước. Bạn không đề cập đến nền tảng hoặc phân phối của mình, nhưng có lẽ nó nằm trong một gói được gọi iostat. Bạn có thể thấy atopthân thiện hơn.

Có phải những người đã nói với bạn điều đó sau khi nhận được bất kỳ bằng chứng nào cho thấy toàn bộ cơ sở dữ liệu của bạn chưa có trong bộ nhớ hoặc I / O của đĩa đó là vấn đề? Mặt khác, lời khuyên của họ là tương đương với một bác sĩ chưa bao giờ nhìn thấy hoặc kiểm tra bạn nhưng chỉ nghe nói rằng cánh tay của bạn bị tổn thương nói với bạn để đặt một diễn viên trên đó.


-1

Cài đặt một plugin bộ nhớ đệm tốt cho Wordpress, nó có thể giúp ích. Nhưng sớm hay muộn bạn phải tìm ra nút thắt làm chậm hệ thống của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.