目录
1.事务是什么?事务的特性?主要作用?一致性是啥,隔离级别,分别解决了什么问题?默认是什么级别?序列化是啥,可重复度读是啥。。。
2.索引是什么、结构、原理以及优缺点;为什么使用B+树;什么情况下不建议使用索引;在一列添加索引,什么情况下索引什么并没有生效,如何改进;索引什么时候都能加快查询吗?
3.数据库锁?死锁是什么?什么情况下会发生死锁?如何避免?
4.视图的作用、优缺点
5.数据库建表存储引擎怎么选(innodb,myisam的区别)?同一条SQL语句在InnoDB和MyISAM下哪个执行快?
6.数据库连接泄漏的含义
7.数据库char和varchar的区别
8.主键和外键的区别?
9.count和sum的区别,count(列名)和count(*)的区别
10..drop、delete以及truncate的区别
11.数据库左连接、右连接是什么,区别?内连接和外连接区别
12.group by 和having
13.数据库的范式
14.数据库的优化的思路
15. Mysql 是什么类型的数据库 还有什么其他类型的数据库? Mysql的优势是什么?
16.select * 为什么不好呢?
17.建立索引和主键怎么考虑
18.数据库的完整性和一致性可以使用什么方法保证
19.五张关联表 如何快速查询 什么方法可以提升查询效率
20.给你一个5亿行的数据,如何设计表?
21.select语句的执行逻辑
22.存储过程
23.数据库数据量大的时候怎么处理
24.一个 SQL 执行的很慢
25.某个表有10条一样的数据,删除其中的9条
26.授权命令,收回用户权限的命令
27.数据库给一个表把年龄23-30之间的人的总数查出来
28.查找学生信息表里姓名第一个字为‘王’的学生姓名
29.给一个成绩表,查找一个班级里平均分大于90的学生姓名
30.删除表和删除字段分别用什么关键词
31.怎么把所有重复的字段查询出来
32.怎么修改一个表的某个字段长度
33.数据库有几种语言?
定义:事务是一个完整的业务逻辑单元,不可再分
特性:
(1)原子性:最小的工作单元,不可再分
(2)一致性:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
(3)隔离性:多个事务并发执行,互不影响
(4)持久性:已被提交的事务应永久保存在数据库中
隔离级别:
(1)读未提交
存在脏读现象:当前事务可以读取到对方未提交的数据。
(2)读已提交
解决了: 脏读现象。
存在不可重复读:一个事务范围内的两个相同的查询却返回了不同数据(update)
(3)可重复读
解决了:不可重复读问题。
存在幻读:同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录insert)。
(4)序列化读
解决了所有问题。效率低。需要事务排队
默认:可重复读
可重复读:事务开启,不允许其他事务的UPDATE修改操作
序列化:这种级别下,事务一个一个排队执行。
定义: 索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。
结构:B + Tree
原理:通过B +Tree缩小扫描范围,底层索引进行了排序,分区,通过索引检索获取到关联的物理地址,通过物理地址定位表中的数据。
优点:
(1)可以大大加快数据的检索速度
缺点:
(1)创建索引需要进行动态的维护
(2)索引需要占用时间和空间
原因:B+树的磁盘读写代价更低;B+树的查询效率更加稳定;
(1)数据唯一性差的字段
(2)频繁更新的字段不要使用索引
(3)字段不在where语句出现时不要添加索引
(4)数据量少的表不要使用索引
(1)条件中有or,即使其中有条件带索引也不会使用
(2)模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。
在有大量插入操作的时候,频繁重建B+树,会有大量的开销,导致速度慢
解决丢失更新、脏读、不可重复读等问题
MySQL大致可归纳为以下3种锁:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
共享锁:允许并发事务读取 (SELECT) 一个资源
排它锁:可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。
更新锁:在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。
从程序员的角度看:分为乐观锁和悲观锁。
乐观锁:数据库不做加锁处理。
悲观锁:整个数据处理过程中,处于锁定状态。
死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
(1)资源互斥使用。
(2)多个进程保持一定的资源,但又请求新的资源。
(3)资源不可被剥夺。
(4)多个进程循环等待
加锁顺序
加锁时限
死锁检测
视图可以隐藏数据的实现细节,保护数据;简化检索,加快查询
优点:简化了操作;安全;逻辑上独立性
缺点:性能差;修改有限制
(1)InnoDB支持事务,MyISAM不支持。
(2)InnoDB支持外键,而MyISAM不支持。
(3)InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。
(4)Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高。
在某次使用后没有正确的关闭Connection、Statement和ResultSet资源,在每次执行后都会留下一些没有关闭的连接,这些连接不能重新使用,造成数据库连接泄漏
Char:类型时定长
Varchar:类型是可变长
主键:能确定一条记录的唯一标识
外键:用于与另一张表的关联
count和sum的区别:求和用sum();求行的个数用count()
count(*):包含所有列,不会忽略为null的列
count(列名):只包括列名那一项,会忽略值为null的计数
drop:删除内容和定义,释放空间。(表结构和数据一同删除)
truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
delete:删除内容,不删除定义,也不释放空间。
效率一般来说:drop> truncate > delete
内连接:A表和B表能够匹配上的记录查询出来,这就是内连接。
外连接:AB两张表中有一张表是主表,一张表是副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
左连接:左边有的,右边没有的为null
右连接:右边有的,左边没有的为null
内连接:显示左边右边共有的
group by :按照某个字段或者某些字段进行分组。
having :having是对分组之后的数据进行再次过滤。
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
(1)硬件优化
(2)结构优化
1)范式优化:消除冗余
2)反范式优化:适当增加冗余
3)避免数据维护中出现更新、插入和删除异常
4)拆分表:垂直拆分和水平拆分
(3)SQL语 句优化
关系型数据库
还有非关系型数据库 nosql
(1)支持多种操作系统。AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等
(2)为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
(3)支持多线程,充分利用CPU资源。
(4)优化的SQL查询算法,有效地提高查询速度。
(5)提供多种数据库连接途径。TCP/IP、ODBC和JDBC等
(6)支持大型的数据库。
(7)支持多种存储引擎。
(8)Mysql是开源的,免费。
要通过查询数据字典完成的,这意味着将耗费更多的时间
(1)主键属于索引的一种。
(2)根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。而主键只是其中的一种。
(1)尽可能使用约束,如主键、非空字段等
(2)使用触发器
(1)确保连接的字段有索引
(2)尽可能把限制条件写在前面(取尽可能少的行)
(3)每次只取必须的数据列(取尽可能少的列)
分库分区,根据主键的范围或者哈希来分
select 6
from 1
join on 2
where 3
group by 4 (按照某个字段或者某些字段进行分组)
having 5 (对分组之后的数据进行再次过滤)
order by 7
存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。类似于C语言中的函数。
限定数据范围
读写分离
垂直分区
水平分区
大多数情况下很正常,偶尔很慢,则有如下原因
(1)、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
(2)、执行的时候,遇到锁,如表锁、行锁。
这条 SQL 语句一直执行的很慢,则有如下原因。
(1)、没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。
(2)、数据库选错了索引。
delete * from 表名 limit 9;
Grant
Revoke
select count(*) from 表名 where age>=23 and age<=30;
between。。and
模糊查询:%代表任意多个字符,_代表任意1个字符。
select name from 表名 where name like ‘王%’
join sc
on s.sno = sc.sno
group by sname
2.select sname, sno, avg(grade) from s
join sc
on s.sno = sc.sno
group by sname
having avg(grade)>90
删除表:drop table tablename;
删除字段:delete from tablename where username = '123';
select 字段名 from 表名 group by 字段名 having (count(字段名)>1)
alter table 表名 modify 字段名 char(20)
SQL语言共分为四大类:
数据查询语言DQL
数据操纵语言DML
数据定义语言DDL
数据控制语言DCL