1.索引:
作用:加快查询速度,减少IO次数,
缺点:需要占用额外的物理空间,对数据库进行修改的时候要额外的维护索引
索引分类:
从索引唯一性的角度:
普通索引:没有唯一性的限制
唯一索引:不允许重复,但可以为空,一个表可以有多个唯一索引,例如,学生号和身份证号可以同时作为唯一索引
主键索引:不允许重复,也不允许为空,一个表中只能有一个主键,学生号和身份证号只能选一个作为主键
从索引和数据行的位置的关系的角度:
聚集索引:索引的顺序决定了对应行的物理顺序,参考字典按拼音查找,因此一个表只能含有一个聚集索引
非聚集索引:索引的顺序与对应行物理顺序不同,参考字典的按偏旁查找,索引相邻的两个词条物理位置可能相差很远
索引的设置原则:
1.频繁查询的字段要建立索引
2.唯一性差的字段不适合建立索引
3.频繁跟新的字段不适合建立索引
以某个字段建立索引的意思是,用那个字段的数据作为关键字组成一棵B+树,以方便查找
2.事务
事务应该具有4个属性:ACID
原子性(Atomicity):一个事务是不可分割的工作单位
一致性(Consistency):在执行一个事务前后保证数据库都必须处于一致性状态
隔离性(Isolation):多个事务并发时,一个事务不应影响其他事务的运行效果
持久性(Durability):事务执行完成后,该事务对数据库的更改是永久的
3.事务并发:
3.1事务并发导致的问题:
脏读: 事务A读取了事务B未提交的脏数据
不可重复读: 事务A两次读取同一数据,但是在两次读取之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致
幻读: 事务A两次按相同条件查询,事务B在两次查询之间插入了其他数据,导致A两次查到的数据变化
3.2事务四个隔离级别对比:
未提交读: 可以读到其他事务未提交的数据,隔离级别最低
提交读: 只对要操作的数据上写锁,只能读取到已经提交的数据(记录写锁)
可重复读: 只对要操作的数据行的读写上锁(记录读写锁)
串行读: 完全的串行化读,即读取使用表级共享锁,读写相互都会阻塞。隔离级别最高(表锁)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 有 | 有 | 有 |
不可重复读 | 无 | 有 | 有 |
可重复读 | 无 | 无 | 有 |
串行化 | 无 | 无 | 无 |
4.常用SQL语句:
Select:
SELECT * FROM Student //从Student表中查询所有记录,打印全表
SELECT name,age FROM Student //从Student表中查询name,age两列记录
SELECT DISTINCT age FROM Student //从Student表中查询age,且所有age都不同
SELECT * FROM Student WHERE age=10; //从Student表中查询所有age=10的记录
SELECT * FROM Student WHERE age > 15 AND name = "Tom"; // &&=AND,||=OR
Insert:
INSERT INTO table_name VALUES (value1,value2,value3,...);
例:INSERT INTO Student VALUES ('Tom', 12, 100);
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
例:INSERT INTO Student (name, age, grade) VALUES ('Tom', 12, 100);
Update:
UPDATE table_name SET column1=value1,column2=value2,...WHERE some_column=some_value;
例:把name为Tom的数据行,age改为11,grade改为100
UPDATE Student SET age='11', grade='100' WHERE name='Tom';
Delete:
DELETE FROM table_name WHERE some_column=some_value;
例:把名字为Tom,年龄为10的数据删除
DELETE FROM Student WHERE name='Tom' AND age='10';
DELETE * FROM table_name; //删除所有数据
数据库的实现方式:
数据库常用的实现方式是B+树 B树及其变体
B+树相比与二叉树最大的优点就是可以减少IO次数