MySQL如何統(tǒng)計(jì)行數(shù)大于100萬的表?針對(duì)這個(gè)問題,這篇文章給出了相對(duì)應(yīng)的分析和解答,希望能幫助更多想解決這個(gè)問題的朋友找到更加簡(jiǎn)單易行的辦法。
磐安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
線上的MySQL服務(wù)器,最近有很多慢查詢。需要統(tǒng)計(jì)出行數(shù)大于100萬的表,進(jìn)行統(tǒng)一優(yōu)化。
需要篩選出符合條件的表,統(tǒng)計(jì)到excel中,格式如下:
庫(kù)名 | 表名 | 行數(shù) |
---|---|---|
db1 | users | 1234567 |
統(tǒng)計(jì)表的行數(shù),有2中方法:
下面來分析一下這2種方案。
第一種方案,不是精確記錄的。雖然效率快,但是表會(huì)有遺漏!
第二鐘方案,才是準(zhǔn)確的。雖然慢,但是表不會(huì)遺漏。
count(1)其實(shí)這個(gè)1,并不是表示第一個(gè)字段,而是表示一個(gè)固定值。
count(1),其實(shí)就是計(jì)算一共有多少符合條件的行。
1并不是表示第一個(gè)字段,而是表示一個(gè)固定值。
其實(shí)就可以想成表中有這么一個(gè)字段,這個(gè)字段就是固定值1,count(1),就是計(jì)算一共有多少個(gè)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 端口號(hào),注意:必須是int類型
connect_timeout = 3 # 超時(shí)時(shí)間
)
cur = conn.cursor() # 創(chuàng)建游標(biāo)
# 獲取mysql中所有數(shù)據(jù)庫(kù)
cur.execute('SHOW DATABASES')
data_all = cur.fetchall() # 獲取執(zhí)行的返回結(jié)果
# print(data_all)
dic = {} # 大字典,第一層
for i in data_all:
if i[0] not in dic: # 判斷庫(kù)名不在dic中時(shí)
# 排序列表,排除mysql自帶的數(shù)據(jù)庫(kù)
exclude_list = ["sys", "information_schema", "mysql", "performance_schema"]
if i[0] not in exclude_list: # 判斷不在列表中時(shí)
# 寫入第二層數(shù)據(jù)
dic[i[0]] = {'name': i[0], 'table_list': []}
conn.select_db(i[0]) # 切換到指定的庫(kù)中
cur.execute('SHOW TABLES') # 查看庫(kù)中所有的表
ret = cur.fetchall() # 獲取執(zhí)行結(jié)果
for j in ret:
# 查詢表的行數(shù)
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('統(tǒng)計(jì)', cell_overwrite_ok=True)
row0 = ["庫(kù)名", "表名", "行數(shù)"]
# 寫第一行
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): # 先對(duì)普通字典key做排序
order_dic[key] = load_dict[key] # 再寫入key
num = 0 # 計(jì)數(shù)器
for i in order_dic:
# 遍歷所有表
for j in order_dic[i]["table_list"]:
# 判斷行數(shù)大于100萬時(shí)
if j['rows'] > 1000000:
# 寫入庫(kù)名
sheet1.write(num + 1, 0, i)
# 寫入表名
sheet1.write(num + 1, 1, j['tname'])
# 寫入行數(shù)
sheet1.write(num + 1, 2, j['rows'])
num += 1 # 自增1
f.save('test1.xls')
執(zhí)行程序,打開excel文件,效果如下:
以上就是MySQL統(tǒng)計(jì)行數(shù)大于100萬表的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊!