一、需求分析

线上的MySQL服务器,最近有很多慢查询。需要统计出行数大于100万的表,进行统一优化。

需要筛选出符合条件的表,统计到excel中,格式如下:

库名 表名 行数
db1 users 1234567

二、统计表的行数

统计表的行数,有2中方法:

1. 通过查询mysql的information_schema数据库中INFODB_SYS_TABLESTATS表,它记录了innodb类型每个表大致的数据行数

2. select count(1) from 库名.表名

下面来分析一下这2种方案。

第一种方案,不是精确记录的。虽然效率快,但是表会有遗漏!

第二钟方案,才是准确的。虽然慢,但是表不会遗漏。

备注:

count(1)其实这个1,并不是表示第一个字段,而是表示一个固定值。

count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.

写入json文件

下面这段代码,是参考我之前写的一篇文章:

https://www.cnblogs.com/xiao987334176/p/9901692.html

在此基础上,做了部分修改,完整代码如下:

#!/usr/bin/env python3
# coding: utf-8 import pymysql
import json conn = pymysql.connect(
host="192.168.91.128", # mysql ip地址
user="root",
passwd="root",
port=3306, # mysql 端口号,注意:必须是int类型
connect_timeout = 3 # 超时时间
) cur = conn.cursor() # 创建游标 # 获取mysql中所有数据库
cur.execute('SHOW DATABASES') data_all = cur.fetchall() # 获取执行的返回结果
# print(data_all) dic = {} # 大字典,第一层
for i in data_all:
if i[0] not in dic: # 判断库名不在dic中时
# 排序列表,排除mysql自带的数据库
exclude_list = ["sys", "information_schema", "mysql", "performance_schema"]
if i[0] not in exclude_list: # 判断不在列表中时
# 写入第二层数据
dic[i[0]] = {'name': i[0], 'table_list': []}
conn.select_db(i[0]) # 切换到指定的库中
cur.execute('SHOW TABLES') # 查看库中所有的表
ret = cur.fetchall() # 获取执行结果 for j in ret:
# 查询表的行数
cur.execute('select count(1) from `%s`;'% j[0])
ret = cur.fetchall()
# print(ret)
for k in ret:
print({'tname': j[0], 'rows': k[0]})
dic[i[0]]['table_list'].append({'tname': j[0], 'rows': k[0]}) with open('tj.json','w',encoding='utf-8') as f:
f.write(json.dumps(dic))

三、写入excel中

直接读取tj.json文件,进行写入,完整代码如下:

#!/usr/bin/env python3
# coding: utf-8 import xlwt
import json
from collections import OrderedDict f = xlwt.Workbook()
sheet1 = f.add_sheet('统计', cell_overwrite_ok=True)
row0 = ["库名", "表名", "行数"] # 写第一行
for i in range(0, len(row0)):
sheet1.write(0, i, row0[i]) # 加载json文件
with open("tj.json", 'r') as load_f:
load_dict = json.load(load_f) # 反序列化文件
order_dic = OrderedDict() # 有序字典
for key in sorted(load_dict): # 先对普通字典key做排序
order_dic[key] = load_dict[key] # 再写入key num = 0 # 计数器
for i in order_dic: # 遍历所有表
for j in order_dic[i]["table_list"]:
# 判断行数大于100万时
if j['rows'] > 1000000:
# 写入库名
sheet1.write(num + 1, 0, i)
# 写入表名
sheet1.write(num + 1, 1, j['tname'])
# 写入行数
sheet1.write(num + 1, 2, j['rows'])
num += 1 # 自增1 f.save('test1.xls')

执行程序,打开excel文件,效果如下:

python 统计MySQL大于100万的表的更多相关文章

  1. 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!

    教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...

  2. python 统计MySQL表信息

    一.场景描述 线上有一台MySQL服务器,里面有几十个数据库,每个库有N多表. 现在需要将每个表的信息,统计到excel中,格式如下: 库名 表名 表说明 建表语句 db1 users 用户表 CRE ...

  3. 统计mysql库中每张表的行数据

    修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...

  4. 题目:企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成 3%; 60万到100万之间时,高于60万元的部分,可提成1.5%; 高于100万元时,超过

    题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%: 20万到 ...

  5. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  6. python 3 mysql 单表查询

    python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

  7. python、mysql四-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar() ); create tabl ...

  8. 微信抢红包小技巧(python模拟100万次)

    之前,在网上看到一篇文章,说多人抢红包时,微信红包金额的分配规则是0.01元到当前剩余金额平均数的2倍(最后一个人金额为当前剩下的所有金额),所以写了一个python程序,模拟量一百万次,分析了一下抢 ...

  9. Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...

随机推荐

  1. 音视频处理之FFmpeg封装格式20180510

    一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...

  2. OpenCV入门指南----人脸检测

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...

  3. Rstdio快捷键总结

    Rstdio常用快捷键总结 在R语言里面输入了一个不完整的指令以后 左下方的console pane一直有加号+,不管输入什么都是加号,只用推出重新打开Rstudio才行,后来google了下,按左上 ...

  4. 完美配置Python3.5+Anaconda+PyQt5,实现UI和其他模块的结合

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  5. P1075 质因数分解

    P1075 质因数分解 题目描述 已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入输出格式 输入格式: 一个正整数 n . 输出格式: 一个正整数 p ,即较大的那个质数. ...

  6. 转:IOS:查找SDK路径和Framework头文件

    通过Terminal进入Xcode.app所在目录,可以找到相应的SDK路径,相关 的Framework的头文件也在改目录下. 示例如下: Frameworks /Applications/xcode ...

  7. 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)

    转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...

  8. element ui 栅格布局

    <el-row> <el-col :span="24"><div class="grid-content bg-purple-dark&qu ...

  9. javascript精雕细琢(二):++、--那点事

    目录 引言 ++和--在数学运算中的计算规则 ++和--在变量引用时的计算规则 ++和--的数据转换应用 引言 对于接触JS时间不长的前端来说,刚开始要实现诸如轮播图,选项卡等小模块时,肯定会用到in ...

  10. bzoj 3309 反演

    $n=p_1^{a_1}p_2^{a_2}…p_k^{a_k},p_i$为素数,定义$f(n)=max(a_1,a_2…,a_k)$. 给定a,b<=1e7求$\sum\limits_{i=1} ...