MySQL查询表结构、表大小
今天删除生产的一个表数据时,数据库服务有点受不住。。。
这个表总数据一百来万条,当时的删除语句差不多删除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; -- 可以同时指定多个表,对多个表进行分析操作。
付出很多努力,却得不到结果的日子,我们把它叫作扎根。-- 烟沙九洲