線上的MySQL服務器,最近有不少慢查詢。須要統計出行數大於100萬的表,進行統一優化。html
須要篩選出符合條件的表,統計到excel中,格式以下:python
庫名 | 表名 | 行數 |
---|---|---|
db1 | users | 1234567 |
統計表的行數,有2中方法:mysql
下面來分析一下這2種方案。sql
第一種方案,不是精確記錄的。雖然效率快,可是表會有遺漏!數據庫
第二鍾方案,纔是準確的。雖然慢,可是表不會遺漏。json
count(1)其實這個1,並非表示第一個字段,而是表示一個固定值。服務器
count(1),其實就是計算一共有多少符合條件的行。
1並非表示第一個字段,而是表示一個固定值。
其實就能夠想成表中有這麼一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.app
寫入json文件
下面這段代碼,是參考我以前寫的一篇文章:ide
https://www.cnblogs.com/xiao987334176/p/9901692.htmlfetch
#!/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))
#!/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文件,效果以下:
歡迎你們一塊兒來玩好PY,一塊兒交流。QQ羣:198447500