面试题答案
一键面试影响SQLite查询性能因素分析
- 数据库文件大小:随着数据量增加,数据库文件变大,磁盘I/O操作耗时增长,影响查询性能。
- 索引缺失:如果查询涉及的列没有合适索引,SQLite需全表扫描,大大降低查询效率。
- 查询语句复杂度过高:复杂的连接(JOIN)、子查询等,增加数据库解析和执行成本。
- 内存使用:SQLite默认使用有限内存进行缓存,大数据量时缓存不足,频繁磁盘读写影响性能。
优化方案
- 合理创建索引
- 对经常用于
WHERE
子句、JOIN
子句的列创建索引。例如,若经常按用户ID查询用户信息,可对user_id
列创建索引:
- 对经常用于
CREATE INDEX idx_user_id ON users(user_id);
- 优化查询语句
- 避免使用
SELECT *
,只选择需要的列,减少数据传输和处理量。 - 简化复杂子查询,可尝试用连接(JOIN)替代部分子查询。
- 避免使用
- 调整缓存大小
- 在Java中通过
PRAGMA
语句设置SQLite的缓存大小。例如,设置缓存大小为1000页:
- 在Java中通过
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLiteCacheExample {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stmt = conn.createStatement()) {
stmt.executeUpdate("PRAGMA cache_size = 1000");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 定期VACUUM
- 随着数据的删除和更新,SQLite数据库文件可能会碎片化。定期执行
VACUUM
操作可重新组织数据库文件,提高性能。在Java中:
- 随着数据的删除和更新,SQLite数据库文件可能会碎片化。定期执行
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLiteVacuumExample {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stmt = conn.createStatement()) {
stmt.executeUpdate("VACUUM");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Java中SQLite数据库事务管理
在Java中,使用JDBC来管理SQLite事务,示例代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLiteTransactionExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection("jdbc:sqlite:test.db");
// 开启事务,默认自动提交关闭
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO users (name, age) VALUES ('Alice', 30)");
stmt.executeUpdate("UPDATE users SET age = age + 1 WHERE name = 'Alice'");
// 提交事务
conn.commit();
} catch (SQLException e) {
// 发生异常回滚事务
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
通过Connection
对象的setAutoCommit(false)
方法关闭自动提交开启事务,在一系列数据库操作完成后调用commit()
方法提交事务,若过程中发生异常,调用rollback()
方法回滚事务,确保数据的一致性和完整性。