先用explain查看性能,如果性能达标可以执行,如果不达标需要添加索引查询



from sqlalchemy import create_engine

class ConnectMysql:
"""操作Mysql"""

instance = None

def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
else:
return cls.instance

def __init__(self, db_url, db_name):
self.engine = create_engine(db_url + db_name)
self.conn = self.engine.connect()

def execute(self, sql):
"""执行sql语句,仅限创建/删除索引"""
try:
assert ('alter' in sql or 'ALTER' in sql or 'drop' in sql or 'DROP' in sql), '非创建/删除索引语句,查询请用fetch_one'
self.conn.execute(sql)
except Exception as e:
log.error("非创建/删除索引语句,sql:{}".format(sql))
log.exception(e)

def explain_sql(self, sql):
"""查看sql性能"""
type_list = ['system', 'const', 'eq_ref', 'ref', 'fulltext', 'ref_or_null', 'index_merge', 'unique_subquery',
'index_subquery', 'range']
try:
execute = self.conn.execute("explain " + sql)
value = execute.fetchone()
if value[3] in type_list:
return True
return False
except Exception as e:
log.error("未查询到数据库,sql:{}".format(sql))
log.exception(e)
return False

def fetch_one(self, sql):
"""查询sql语句返回的第一条数据"""
try:
assert self.explain_sql(sql), 'sql语句性能未达标'
execute = self.conn.execute(sql)
value = execute.fetchone()
return value[0]
except Exception as e:
log.error("未查询到数据库,sql:{}".format(sql))
log.exception(e)

def fetch_one_with_index(self, add_index_sql, sql, drop_index_sql):
"""创建索引,查询sql语句返回的第一条数据"""
self.execute(add_index_sql)
value = self.fetch_one(sql)
self.execute(drop_index_sql)
return value