- 合理使用索引
- 方法阐述:在多表关联的字段以及经常用于
WHERE
条件过滤的字段上创建索引。例如,在一个订单系统中,orders
表和customers
表通过customer_id
关联,并且经常根据customer_id
查询订单,那么在orders
表的customer_id
字段上创建索引,可以大大加快查询速度。
- JDBC代码示例:创建索引通常在数据库层面操作,JDBC中执行创建索引语句示例如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class CreateIndexExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
String createIndexSql = "CREATE INDEX idx_customer_id ON orders (customer_id)";
stmt.executeUpdate(createIndexSql);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 优化SQL语句结构
- 方法阐述:
- 减少子查询:能用连接(
JOIN
)解决的问题尽量不用子查询。例如,查询每个客户的订单数量,子查询写法可能是先从orders
表统计每个客户的订单数,再和customers
表关联;而用连接可以直接通过JOIN
两个表并使用GROUP BY
统计。
- 避免使用
SELECT *
:只选择需要的列,这样可以减少数据传输量和处理时间。假设orders
表有很多列,但我们只需要order_id
和order_date
,就不要写SELECT * FROM orders
,而是SELECT order_id, order_date FROM orders
。
- JDBC代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class OptimizedSqlExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "root";
String password = "password";
String optimizedSql = "SELECT c.customer_name, COUNT(o.order_id) AS order_count " +
"FROM customers c " +
"JOIN orders o ON c.customer_id = o.customer_id " +
"GROUP BY c.customer_id, c.customer_name";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(optimizedSql)) {
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
String customerName = rs.getString("customer_name");
int orderCount = rs.getInt("order_count");
System.out.println("Customer: " + customerName + ", Order Count: " + orderCount);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 使用分页查询
- 方法阐述:当检索大量数据时,使用分页技术每次只获取部分数据,减少单次查询的数据量。例如,在MySQL中可以使用
LIMIT
关键字进行分页,在Oracle中可以使用ROWNUM
等方式。假设我们每页显示10条数据。
- JDBC代码示例(以MySQL为例):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class PaginationExample {
public static void main(String[] args) {
int pageNumber = 1;
int pageSize = 10;
int offset = (pageNumber - 1) * pageSize;
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "root";
String password = "password";
String paginationSql = "SELECT * FROM orders LIMIT?,?";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(paginationSql)) {
pstmt.setInt(1, offset);
pstmt.setInt(2, pageSize);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
// 处理数据
int orderId = rs.getInt("order_id");
System.out.println("Order ID: " + orderId);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 批量操作
- 方法阐述:当需要对数据库进行多次相同类型的操作(如插入多条数据)时,使用批量操作可以减少数据库交互次数,提高性能。例如,有一批订单数据要插入到
orders
表中。
- JDBC代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class BatchOperationExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "root";
String password = "password";
String insertSql = "INSERT INTO orders (order_id, order_date, customer_id) VALUES (?,?,?)";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(insertSql)) {
// 假设这里有一个订单数据的集合,这里简单构造几条数据示例
int[][] orderData = {
{1, 1672531200, 1},
{2, 1672531201, 2}
};
for (int[] data : orderData) {
pstmt.setInt(1, data[0]);
pstmt.setInt(2, data[1]);
pstmt.setInt(3, data[2]);
pstmt.addBatch();
}
pstmt.executeBatch();
} catch (Exception e) {
e.printStackTrace();
}
}
}