数据库综合总结
Delete和Drop的区别
- 当你不再需要该表时,使用drop关键字
- 当你还需要该表但是需要删除所有数据时,使用truncate关键字(truncate table 表名)
- 当你还需要该表但是只需要删除表记录时,使用delete关键字(delete from 表名)
端口号
- nginx默认监听:80
- mysql:3306
- redis:6379
- sentinel:26379
- zookeeper:2181
- dubbo:20880
id生成算法
主键自增并不适用于高并发的情况下,应该自己设置id的生成算法
事务的四种隔离级别
事务亟待解决的问题有:脏读,不可重复度,幻读
- 读未提交 Read uncommitted 事务最低的隔离级别(会引起脏读,不可重复度,幻读)
一个事物可以读取到另一个事物未提交的数据 - 读已提交 Read committed (避免了脏读,但是会引起不可重复度,幻读)
概念: 一个事务要等待一个事物完成提交后,才能进行读取操作,故解决了脏读的问题
表示当两次同样的查询操作,查询出的两次结果是不同的,因为当中允许修改操作,故会引起不可重复读 - 可重复度 Repeatable read (避免了脏读,不可重复读)
概念:表示当两次同样的查询操作,中间不在允许修改数据操作,故可以避免了不可重复读 - 序列化 Serializable 最可靠的事务隔离级别(还可以解决幻读的问题【幻读的问题也就是两个事物之间发生的insert操作)】
SQL包含哪些语言
数据定义语言 DDL(Data Define Language)
数据操纵语言 DML(Data Manipulation Language)
数据查询语言 DQL(Data Query Language)
数据控制语言 DCL(Data Control Language)
事务控制语言 TCL(Transaction Control Language)
数据库索引的作用
索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构.
什么适合索引,什么不适合索引
- 主键自动建立唯一索引;
- 频繁作为查询条件的字段应该创建索引;
- 查询中与其他表有关联的字段,例如外键关系;
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;
- where条件里用不到的字段,不创建索引;
- 高并发的情况下一般选择复合索引;
- 查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);
- 查询中统计或者分组的字段;
- 表记录太少,不需要创建索引;
- 经常增删改的表;
- 数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引.注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引.
为什么要用sql占位符
防止sql注入.当传入的语句部分含有sql语句的关键字的时候,就会破坏sql语句的结构
数据库可以直接访问的请求连接的最大数是
最大值是500-1000左右.
故因此提出了缓存的概念.
mysql中的in函数,能放多少数据
- 没有任何的数据限制,但是当in函数中有过多的数据时,非常影响效率,
- 可以使用exist来替代in,能够提高sql的执行效率,
- 仅仅受sql最长长度的限制
如何通过优化sql来提高数据库的查询效率
- 应尽量避免在where语句中使用!=或> < 操作符,否则引擎将放弃索引而进行全表扫描
- 应尽量避免在where语句中使用or来连接条件,否则引擎将放弃使用索引而进行全表扫描
- 避免使用in,not in(同6)
- 避免使用like
- 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引.
例如select id from t from num/2=100;应改为: select id from t where num=100*2 - 很多时候用 exists 代替 in 是一个好的选择
- 不要使用select * from t,会很大程度降低sql语句的运行效率
sql中什么时候用内连接查询,什么时候用外连接查询
需要查找两张表同时存在的数据,使用内连接
需要查找两张表中一张表存在,另一张表不存在的时候使用左外连接或右外连接,例如老师和没有老师的学生
sql:
(1)外连接查询:左右外连接查询:左
select * from table1 t1 left join table2 t2 on where t1.id=t2._id;
(2)排序查询
升序排序
select * from table order by id asc
降序排序
select * from table order by id desc
事务提交的三种方式
什么是显式提交,什么是隐式提交?
显式提交也就是commit
隐式提交是:SQL命令间接完成的提交为隐式提交,隐式提交不能回滚
自动提交:AUTOCOMMIT设置为ON
sql中where和having的区别
- where是对分组之前的数据进行过滤
- having是对分组之后的数据进行过滤
- where中不能使用:列别名和聚合函数,但是可以使用表别名
- having中可以使用表别名和聚合函数
- 有时候having可以替代where,但是where不一定能替代having
timestamp和datatime的区别
- datatime的存储内容和显示内容是相同的
- timestamp的存储内容和显示内容是不相同的,时间戳实际上存储的是从1970年1月1日到指定之日的毫秒值
- 可以使用范围不同
- 时间戳可以自动更新为当前时间,但是datatime不会
事务七大传播机制
- required 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择.
- upports 支持使用当前事务,如果当前事务不存在,则不使用事务.
- mandatory 中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception.
- requires_new 创建一个新事务,如果当前事务存在,把当前事务挂起
- not_supported无事务执行,如果当前事务存在,把当前事务挂起.
- never 无事务执行,如果当前有事务则抛出Exception.
- nested 嵌套事务,如果当前事务存在,那么在嵌套的事务中执行.如果当前事务不存在,则表现跟REQUIRED一样.
模糊查询
慎用全模糊查询(%...%),左模糊查询(%...),都会导致全表扫描,但是右模糊查询(...%)则不会全表查询. like %aa% --> aa%
应尽量避免在where字句中对字段进行表达式操作, select a from table where a/2 >10
--> select a from table where a>20;
数据库的三大范式?
- 第一范式:原子性 字段不可再分,否则就不是关系数据库;(列表字段不可分)
- 第二范式:唯一性 要求数据库表中的每个记录必须可以被惟一地区分
- 第三范式:每列都与主键有直接关系,而不是间接相关
- 三大范式的优点和缺点:
优点:结构合理,可以避免插入删除修改数据错误
缺点:性能降低,多表查询比单标查询速度慢
事务开始和结束的时间?
- 开始:开始执行DML数据操纵语言
- 结束:执行提交commit或回滚语句rollback;
- 执行一条DDL语句;数据定义语言
- 执行一条DCL语句;数据控制语言
- 断开与数据库的连接
数据库中索引的优缺点:
定义:索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录.
- 索引的优点:
- 可以大大加快表查询的效率
- 通过创建唯一性索引,可以保证数据库中每一行数据的唯一性
- 可以加快表与表之间的连接
- 索引的缺点:
- 创建索引和维护索引是需要时间的.
- 索引是占用物理内存的
- 索引是需要随着表中数据的增删改来不断进行动态维护的.
- 故当使用DML语言超过DQL语言的数量的时候,不再推荐使用索引来进行操作
- 索引需要占用磁盘空间,且创建索引的时候需要对表进行加锁,且占用磁盘空间为普通表的1.5倍
- 分类:
- 主键索引
- 外键索引
- 普通索引
- 全文索引
- 组合索引
伪表
当查询的内容不和任何表中的数据有关系的时候,可以使用伪表,伪表能会查询出一条记录