2012-03-29 26 views
8

Xin chào Tôi mới sử dụng cơ sở dữ liệu. Tôi đang làm việc trên cơ sở dữ liệu khổng lồ và cố gắng dọn dẹp đống lộn xộn. Tôi muốn bắt đầu bằng cách tìm mười bảng hàng đầu chiếm bộ nhớ cao nhất trong toàn bộ cơ sở dữ liệu. Tôi không thể đi bằng cách tìm bộ nhớ của mỗi bảng vì có quá nhiều bảng. Tôi cần 10 hoặc 20 bảng hàng đầu chiếm không gian tối đa. Bất kì sự trợ giúp nào đều được đánh giá cao. Cảm ơn bạn.Làm thế nào để tìm ra các bảng chiếm bộ nhớ tối đa trong cơ sở dữ liệu?

+0

Bạn có muốn tiêu thụ bộ nhớ hoặc dung lượng đĩa không ??? – RolandoMySQLDBA

+0

Tôi muốn dung lượng đĩa và dung lượng bộ nhớ. – Maddy

Trả lời

4

MyISAM chỉ chiếm bộ nhớ cho chỉ số của nó

Để tìm 10 bảng MyISAM hàng đầu mà có thể sử dụng bộ nhớ nhất trong trường hợp xấu nhất thử điều này:

SELECT * FROM 
(
    SELECT table_schema,table_name,index_length 
    FROM information_schema.tables 
    WHERE engine='MyISAM' AND 
    table_schema NOT IN ('information_schema','mysql','performance_schema') 
    ORDER BY index_length DESC 
) LIMIT 10; 

InnoDB chiếm bộ nhớ cho dữ liệu của nó và lập chỉ mục

Để tìm 10 bảng InnoDB hàng đầu mà có thể sử dụng bộ nhớ nhất trong trường hợp xấu nhất thử điều này:

SELECT * FROM 
(
    SELECT table_schema,table_name,data_length+index_length tblsize 
    FROM information_schema.tables 
    WHERE engine='InnoDB' 
    ORDER BY index_length DESC 
) LIMIT 10; 

Dưới đây là một hiển thị của 50 bảng đầu bởi kích thước giảm dần

SELECT * FROM 
(SELECT TN TableName,LPAD(REPLACE(FORMAT(TS/POWER(1024,1),2),',',''),Z,' ') KB, 
LPAD(REPLACE(FORMAT(TS/POWER(1024,2),2),',',''),Z,' ') MB, 
LPAD(REPLACE(FORMAT(TS/POWER(1024,3),2),',',''),Z,' ') GB 
FROM (SELECT CONCAT(table_schema,'.',table_name) TN, 
(data_length+index_length) TS FROM information_schema.tables 
WHERE table_schema NOT IN ('information_schema','mysql','performance_schema') 
AND engine IS NOT NULL) A,(SELECT 13 Z) B ORDER BY TS DESC) MMM LIMIT 50; 

Nếu bạn quan tâm, tôi có thắc mắc mà cung cấp cho bạn toàn bộ câu chuyện trên MySQL Instance

truy vấn này cho bạn thấy số tiền không gian đĩa được thực hiện bởi Storage Engine trong GB

SELECT IFNULL(B.engine,'Total') "Storage Engine", 
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '), 
' ',SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", 
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '), 
' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" 
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize, 
SUM(data_length+index_length) TSize FROM information_schema.tables 
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema') 
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A ORDER BY TSize; 

truy vấn này cho bạn thấy dung lượng đĩa được thực hiện bởi cơ sở dữ liệu trong GB

SELECT DBName,CONCAT(LPAD(FORMAT(SDSize/POWER(1024,pw),3),17,' '), 
' ',SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",CONCAT(LPAD(FORMAT(SXSize/ 
POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", 
CONCAT(LPAD(FORMAT(STSize/POWER(1024,pw),3),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Total Size" FROM 
(SELECT IFNULL(DB,'All Databases') DBName,SUM(DSize) SDSize, 
SUM(XSize) SXSize,SUM(TSize) STSize FROM (SELECT table_schema DB, 
data_length DSize,index_length XSize,data_length+index_length TSize 
FROM information_schema.tables WHERE table_schema NOT IN 
('mysql','information_schema','performance_schema')) AAA 
GROUP BY DB WITH ROLLUP) AA,(SELECT 3 pw) BB ORDER BY (SDSize+SXSize); 

truy vấn này cho bạn thấy dung lượng đĩa được thực hiện bởi cơ sở dữ liệu bằng cách Storage Engine trong GB

SELECT IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases", 
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,CONCAT("Storage for ",B.table_schema), 
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,CONCAT(LPAD(REPLACE(
FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') 
"Data Size",CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '), 
' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size",CONCAT(LPAD(REPLACE(FORMAT(B.TSize/ 
POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" 
FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize, 
SUM(data_length+index_length) TSize FROM information_schema.tables WHERE 
table_schema NOT IN ('mysql','information_schema','performance_schema') 
AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B, 
(SELECT 3 pw) A ORDER BY TSize; 

Ba truy vấn trước đó tôi đã đăng có một đặc điểm chung: subquery (SELECT 3 pw)

  • Nếu bạn sử dụng (SELECT 0 pw), báo cáo nằm trong Bytes
  • Nếu bạn sử dụng (SELECT 1 pw), báo cáo ở KiloBytes
  • Nếu bạn sử dụng (SELECT 2 pw), báo cáo là bằng megabyte
  • Nếu bạn sử dụng (SELECT 3 pw), báo cáo là trong gigabyte
  • Nếu bạn sử dụng (SELECT 4 pw), báo cáo được trong terabyte
  • Nếu bạn sử dụng (SELECT 5 pw), báo cáo là trong petabytes (Nếu bạn cần này, đăng kết quả đó xin vui lòng !!!)
+0

Điều này thật tuyệt vời !! Bạn thật tuyệt vời! Nó đã giúp tôi rất nhiều !! .. :) – Maddy

+1

Bạn nên đăng câu hỏi như thế này trong dba.stackexchange.com. Tôi cũng đang ở trong diễn đàn đó. – RolandoMySQLDBA

+0

Bạn được chào đón !!! – RolandoMySQLDBA

5

Có lẽ một cái gì đó như thế này:

SELECT CONCAT(table_schema, '.', table_name), 
     CONCAT(ROUND(table_rows/1000000, 2), 'M')         rows, 
     CONCAT(ROUND(data_length/(1024 * 1024 * 1024), 2), 'G')     DATA, 
     CONCAT(ROUND(index_length/(1024 * 1024 * 1024), 2), 'G')     idx, 
     CONCAT(ROUND((data_length + index_length)/(1024 * 1024 * 1024), 2), 'G') total_size, 
     ROUND(index_length/data_length, 2)           idxfrac 
FROM information_schema.TABLES 
ORDER BY data_length + index_length DESC 
LIMIT 10; 

Reference here

+0

Cảm ơn bạn rất nhiều. – Maddy

+1

Không sao cả. Rất vui được giúp bạn – Arion

2

Đây là truy vấn tôi đã sử dụng sau khi đọc tất cả câu trả lời của bạn.

SELECT table_name,round((data_length+index_length)/(1024 * 1024 *1024),2) table_size 
    FROM information_schema.tables 
    ORDER BY data_length + index_length 
    DESC limit 10; 
+1

+1 để sử dụng câu trả lời của tôi để xây dựng bạn sở hữu – RolandoMySQLDBA

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