MySQL查询表结构、表大小

发布于:2025-08-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

今天删除生产的一个表数据时,数据库服务有点受不住。。。

这个表总数据一百来万条,当时的删除语句差不多删除70万条数据。我一执行,运维大哥就在喊有异常,有异常。生产数据库自动切换到了备库,主库应该是遭不住了。下午点,我又执行了一次,运维大哥又在喊,有异常,有异常。

后头分析了下,执行二三十万的删除是没有问题的。执行删除数据多了,就会有问题。运维大哥说是因为数据量多了之后,把表锁住了,当表释放的时候,其他有等待写入的连接一下子涌进来,服务器就遭不住了。有点道理。

优化了下,删除时,限制了天数,再加上了条件,影响粒度小了。应该没啥问题,观察观察。以后执行大批量操作得注意,尽量在 低峰期 执行。

今天我们随笔两句。

查看表结构

DESC user;
DESCRIBE user;
SHOW CREATE TABLE user;
-- 都是可以的。

查看表数据大小

-- 以 MB 为单位
SELECT 
    table_name AS `表名`,
    ROUND(data_length / (1024 * 1024), 4) AS `数据大小(MB)`,
    ROUND(index_length / (1024 * 1024), 4) AS `索引大小(MB)`,
    ROUND((data_length + index_length) / (1024 * 1024), 4) AS `总大小(MB)`
FROM 
    information_schema.TABLES 
WHERE 
    table_schema = 'ysjz' AND table_name = 'user';

-- 以 GB 为单位
SELECT 
    table_name AS `表名`,
    ROUND(data_length / (1024 * 1024 * 1024), 4) AS `数据大小(GB)`,
    ROUND(index_length / (1024 * 1024 * 1024), 4) AS `索引大小(GB)`,
    ROUND((data_length + index_length) / (1024 * 1024 * 1024), 4) AS `总大小(GB)`
FROM 
    information_schema.TABLES 
WHERE 
    table_schema = 'ysjz' AND table_name = 'user';

将 数据库名 ysjz表名 user,替换为对应查询的数据库名和表名即可。

有时我们会发现,明明表中的数据都增加了好几十万,但是多次执行以上的查询表数据的SQL,结果都一样。这时我们可以使用 ANALYZE TABLE 语句来更新统计信息。

ANALYZE TABLE user, order; -- 可以同时指定多个表,对多个表进行分析操作。

付出很多努力,却得不到结果的日子,我们把它叫作扎根。-- 烟沙九洲


网站公告

今日签到

点亮在社区的每一天
去签到