9.1 数据库基本原理
1.PrepareStatement预编译
1. statement.executeUpdate("UPDATE Users SET status=2 WHERE userID=233");
2. PreparedStatement updateUser=connection.prepareStatement("UPDATE users SET status=? WHERE userID=233");
updateUser.setInt(1,2);
updateUser.executeUpdate();
2.数据库架构
3.连接器
数据库连接器会为每个连接请求分配一块专用的内存空间用于会话上下文管理。
建立连接,对数据库而言相对比较重,需要花费一定的时间,
因此应用程序启动的时候,通常会初始化建立一些数据库连接放在连接池里,
这样当处理外部请求执行SQL操作的时候,就不需要花费时间建立连接。
4.语法分析器
抽象语法树
mysql> explan select * from users whee id =1
ERROR 1064(42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'id=1' at line 1.
5.语义分析与优化器
数据库引擎:
语义分析与优化器:要将各种复杂嵌套的SQL进行语义转换,得到有限集中关系代数计算结构,并利用索引等信息进一步优化。
select f.id from orders f where f.user_id =(select id for users).
select f.id from orders f join users u on f.user_id=u.id;
6.执行计划
Key:索引类型,NULL无索引。
Rows:需要处理的行数。
Possible_keys:潜在可利用的索引。
7.为什么PrepareStatement更好
PrepareStatement会预先提交但占位符的SQL到数据库进行预处理,提前生成执行计划。
当给定占位符参数,真正执行SQL的时候,执行引擎可以直接执行,效率更好一点。
PrepareStatement可以防止SQL注入攻击。------抽象语法树和执行计划提前生成,不会再被改变。
直接提交SQL语句,SQL语句被恶意拼接后,提交到数据库执行----不能防止SQL注入。
SQL注入攻击:
select * from users where username ='Frank'
Frank'; drop table users;--
select * from users where username ='Frank';drop table users;--';
8.B+树
解析:多叉查找树。叶子节点存储数据。非叶子节点存储索引。B+树存储索引。
9.聚簇索引--(物理索引)--主键索引
聚簇索引:数据库行记录和索引存储在一起。
MySQL数据库的主键就是聚簇索引,主键ID和所在的记录行存储在一个B+树中。
查找时,快速找到主键,根据主键找到对应的行记录。
10.非聚簇索引--(逻辑索引)--非主键索引
非聚簇索引:叶子结点记录的就不是数据行记录,而是聚簇索引,也就是主键。
通过非聚簇索引找到主键索引,在通过主键索引找到行记录的过程也被称作回表。
10.添加必要的索引优化SQL查询性能
在几百万行的数据库中查找一条记录,如果没有索引,就需要全表扫描,检索所有的行记录,才能找到需要的记录。
11.合理使用索引
不要盲目添加索引,尤其在生产环境中
添加索引的alter操作会消耗较长的时间(分钟级)
Alter操作期间,数据库所有的增删改操作全部阻塞,对应用而言,因为连接不能释放,事实上,查询也被阻塞。
删除不用的索引,避免不必要的增删开销。
使用更小的数据类型创建索引
int 4字节,bigint 8字节,Timestamp 4字节, DateTime 8字节。
12.数据库事务
事务特性ACID:
原子性(Atomicity):事务要么全部完成,要么全部取消。如果事务崩溃,状态回到事务之前(事务回滚)。
隔离性(Isolation):如果2个事务T1和T2同时运行,事务T1和T2的最终的结果是相同的。不管T1和T2谁先结束,隔离性主要靠锁实现。
持久性(Durability):一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数据库中。
一致性(Consistency):只有合法的数据(依照关系约束和函数约束)才能写入数据库。
begin----------开始一个事务
update table set A=A-1000;
update table set B=B+1000;
------其他事务提交;
commit;--------提交事务。
12.数据库事务日志
进行事务操作时,事务日志文件会记录更新前的数据记录,然后在更新数据库中的记录,如果全部记录都更新成功,那么事务正常结束。 如果过程中某条记录更新失败,那么整个事务全部回滚,已经更新的记录根据事务日志中记录的数据进行恢复, 这样全部数据都恢复到事务提交前的状态,仍然保持数据一致性。
LSN:一个按时间顺序分配的唯一事务日志序列号。
TransID:产生操作的事务ID。
PageID:被修改的数据在磁盘上的位置。
PreLSN:同一个事务产生的上一条日志记录的指针。
UNDO:取消本次操作的方法,按照此方法回滚。
REDO:重复本次操作的方法。
评论