Mysql,再见吧!select * !

本文分享了12个SQL语句优化技巧,包括合理使用比较运算符、限制查询结果、选择合适的数据类型等,旨在帮助程序员提升数据库查询效率。

作者:AIOps

文章来源互联网:未找到原创链接,如果需要删除或者说明请联系我:baiseyumaoxx

应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。

那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。

程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半功倍的效果。

技巧1  比较运算符能用 “=”就不用“<>”

“=”增加了索引的使用几率。

技巧2  明知只有一条查询结果,那请使用 “LIMIT 1”

“LIMIT 1”可以避免全表扫描,找到对应结果就不会再继续扫描了。

技巧3  为列选择合适的数据类型

能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盘和内存消耗越小越好嘛。

技巧4  将大的DELETE,UPDATE or INSERT 查询变成多个小查询

能写一个几十行、几百行的SQL语句是不是显得逼格很高?然而,为了达到更好的性能以及更好的数据控制,你可以将他们变成多个小查询。

技巧5  使用UNION ALL 代替 UNION,如果结果集允许重复的话

因为 UNION ALL 不去重,效率高于 UNION。

技巧6  为获得相同结果集的多次执行,请保持SQL语句前后一致

这样做的目的是为了充分利用查询缓冲。

比如根据地域和产品id查询产品价格,第一次使用了:

那么第二次同样的查询,请保持以上语句的一致性,比如不要将where语句里面的id和region位置调换顺序。

技巧7  尽量避免使用 “SELECT *”

如果不查询表中所有的列,尽量避免使用 SELECT *,因为它会进行全表扫描,不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络IO开销。

技巧8  WHERE 子句里面的列尽量被索引

只是“尽量”哦,并不是说所有的列。因地制宜,根据实际情况进行调整,因为有时索引太多也会降低性能。

技巧9  JOIN 子句里面的列尽量被索引

同样只是“尽量”哦,并不是说所有的列。

技巧10  ORDER BY 的列尽量被索引

ORDER BY的列如果被索引,性能也会更好。

技巧11  使用 LIMIT 实现分页逻辑

不仅提高了性能,同时减少了不必要的数据库和应用间的网络传输。

技巧12  使用 EXPLAIN 关键字去查看执行计划

EXPLAIN 可以检查索引使用情况以及扫描的行。

其他

SQL调优方法有很多种,同样的查询结果可以有很多种不同的查询方式。其实最好的方法就是在开发环境中用最贴近真实的数据集和硬件环境进行测试,然后再发布到生产环境中。

好的,我很乐意为您介绍如何使用Java和MySQL来实现一个简单的银行存取款系统。这个系统将包含基本的用户认证、账户余额查询、存款和取款功能。以下是一个基本的实现方案: 1. 数据库设计: 首先,我们需要创建一个MySQL数据库来存储用户信息和账户信息。可以创建两个表:users(用户表)和accounts(账户表)。 ```sql CREATE DATABASE bank_db; USE bank_db; CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL ); CREATE TABLE accounts ( account_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, balance DECIMAL(10,2) DEFAULT 0.00, FOREIGN KEY (user_id) REFERENCES users(user_id) ); ``` 2. Java项目结构: 创建一个Java项目,包含以下类: - BankApp: 主类,包含main方法 - DatabaseConnection: 数据库连接类 - User: 用户实体类 - Account: 账户实体类 - BankService: 银行业务逻辑类 3. 主要代码实现: ```java // DatabaseConnection.java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnection { private static final String URL = "jdbc:mysql://localhost:3306/bank_db"; private static final String USER = "root"; private static final String PASSWORD = "password"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } } // User.java public class User { private int userId; private String username; private String password; // 构造方法、getter和setter方法 } // Account.java public class Account { private int accountId; private int userId; private double balance; // 构造方法、getter和setter方法 } // BankService.java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BankService { public User login(String username, String password) throws SQLException { String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); pstmt.setString(2, password); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { User user = new User(); user.setUserId(rs.getInt("user_id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); return user; } } return null; } public Account getAccountInfo(int userId) throws SQLException { String sql = "SELECT * FROM accounts WHERE user_id = ?"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { Account account = new Account(); account.setAccountId(rs.getInt("account_id")); account.setUserId(rs.getInt("user_id")); account.setBalance(rs.getDouble("balance")); return account; } } return null; } public boolean deposit(int accountId, double amount) throws SQLException { String sql = "UPDATE accounts SET balance = balance + ? WHERE account_id = ?"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setDouble(1, amount); pstmt.setInt(2, accountId); int rows = pstmt.executeUpdate(); return rows > 0; } } public boolean withdraw(int accountId, double amount) throws SQLException { String sql = "UPDATE accounts SET balance = balance - ? WHERE account_id = ? AND balance >= ?"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setDouble(1, amount); pstmt.setInt(2, accountId); pstmt.setDouble(3, amount); int rows = pstmt.executeUpdate(); return rows > 0; } } } // BankApp.java import java.sql.SQLException; import java.util.Scanner; public class BankApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); BankService service = new BankService(); System.out.println("欢迎使用银行系统"); System.out.print("请输入用户名: "); String username = scanner.nextLine(); System.out.print("请输入密码: "); String password = scanner.nextLine(); try { User user = service.login(username, password); if (user != null) { System.out.println("登录成功!"); Account account = service.getAccountInfo(user.getUserId()); if (account != null) { System.out.println("账户余额: " + account.getBalance()); System.out.print("请选择操作: 1.存款 2.取款 3.退出: "); int choice = Integer.parseInt(scanner.nextLine()); switch (choice) { case 1: System.out.print("请输入存款金额: "); double depositAmount = Double.parseDouble(scanner.nextLine()); if (service.deposit(account.getAccountId(), depositAmount)) { System.out.println("存款成功!"); } else { System.out.println("存款失败!"); } break; case 2: System.out.print("请输入取款金额: "); double withdrawAmount = Double.parseDouble(scanner.nextLine()); if (service.withdraw(account.getAccountId(), withdrawAmount)) { System.out.println("取款成功!"); } else { System.out.println("取款失败!可能余额不足"); } break; case 3: System.out.println("谢谢使用,再见!"); break; default: System.out.println("无效的选择"); } } else { System.out.println("无法获取账户信息"); } } else { System.out.println("登录失败!用户名或密码错误"); } } catch (SQLException e) { e.printStackTrace(); } scanner.close(); } } ``` 这个简单的银行系统实现了基本的用户登录、账户余额查询、存款和取款功能。在实际应用中,您可能需要添加更多的错误处理、安全措施以及功能扩展,比如转账功能、交易历史记录等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值