面试题答案
一键面试SQL语句优化
- 添加索引:
- 为
age
字段添加索引,在MySQL中可以使用以下语句创建索引:
CREATE INDEX idx_age ON users(age);
- 这样在执行
SELECT id, name, age, email FROM users WHERE age > 30;
查询时,数据库可以利用索引快速定位符合条件的数据,大大提高查询效率。
- 为
- 避免使用函数操作:
- 如果在
WHERE
子句中对age
字段使用函数,例如SELECT... WHERE YEAR(CURRENT_DATE) - YEAR(birth_date) > 30;
(假设原本存储的是出生日期字段),会导致索引失效,应尽量避免这种写法,直接使用存储的age
字段进行比较。
- 如果在
Python代码层面优化
- 合理使用连接池:
- 使用连接池来管理数据库连接,避免频繁创建和销毁连接带来的开销。例如使用
DBUtils
库与pymysql
结合,示例代码如下:
from dbutils.pooled_db import PooledDB import pymysql pool = PooledDB(pymysql, 5, host='localhost', user='root', passwd='password', db='test', port=3306) conn = pool.connection() try: cursor = conn.cursor() cursor.execute("SELECT id, name, age, email FROM users WHERE age > 30") results = cursor.fetchall() for row in results: print(row) finally: conn.close()
- 使用连接池来管理数据库连接,避免频繁创建和销毁连接带来的开销。例如使用
- 批量获取数据:
- 避免一次获取大量数据,可使用
fetchmany(size)
方法,每次获取一定数量的数据,例如:
import pymysql conn = pymysql.connect(host='localhost', user='root', passwd='password', db='test', port=3306) try: cursor = conn.cursor() cursor.execute("SELECT id, name, age, email FROM users WHERE age > 30") while True: rows = cursor.fetchmany(100) # 每次获取100条数据 if not rows: break for row in rows: print(row) finally: conn.close()
- 避免一次获取大量数据,可使用
- 关闭自动提交:
- 关闭自动提交功能,在需要提交事务时手动提交,减少数据库I/O操作。示例如下:
import pymysql conn = pymysql.connect(host='localhost', user='root', passwd='password', db='test', port=3306, autocommit=False) try: cursor = conn.cursor() cursor.execute("SELECT id, name, age, email FROM users WHERE age > 30") results = cursor.fetchall() for row in results: print(row) conn.commit() except Exception as e: conn.rollback() raise e finally: conn.close()