进程与线程
一个进程如果只有一个线程叫做单线程
一个进程如果又多个线程叫做多线程
线程的执行是靠CPU执行,一个cpu一个时间只能运行一件事情,不过他的执行速度是非常快的,可以达到纳秒级,肉眼看的话是一起执行。关于同一时间CPU做一件事 这种现象叫做串行
反言之
如果在同一时刻多个CPU同时执行多个线程叫做并行
串行:
cpu执行的时机会根据时间片执行(如:有123三个线程需要执行,给每个线程的之间为一毫秒,如果在这一毫秒之间1这个线程没有执行完,也会直接跳到线程2)
OS底层有两种执行规则 第一是先来先服务,第二是段服务,
线程生命周期,主要有五种状态:
-
新建状态(New) : 当线程对象创建后就进入了新建状态.如:Thread t = new MyThread();
-
就绪状态(Runnable):当调用线
程对象的start()方法,线程即为进入就绪状态.
处于就绪(可运行)状态的线程,只是说明线程已经做好准备,随时等待CPU调度执行,并不是执行了t.start()此线程立即就会执行
-
运行状态(Running):当CPU调度了处于就绪状态的线程时,此线程才是真正的执行,即进入到运行状态
就绪状态是进入运行状态的唯一入口,也就是线程想要进入运行状态状态执行,先得处于就绪状态
-
阻塞状态(Blocked):处于运状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入就绪状态才有机
会被CPU选中再次执行.
根据阻塞状态产生的原因不同,阻塞状态又可以细分成三种:
等待阻塞:运行状态中的线程执行wait()方法,本线程进入到等待阻塞状态
同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态
其他阻塞:调用线程的sleep()或者join()或发出了I/O请求时,线程会进入到阻塞状态.当sleep()状态超时.join()等待线程终止或者超时或者I/O
处理完毕时线程重新转入就绪状态
-
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期
数据库
命名规则:
必须以字母开头
不能超过30个字符
不能使用保留字
多个字母用___下划线隔开,
字符规则:
字符串:
char长度固定,不足使用空格,最多2000,查询快
varchar(11):最多4000,最多11个,不过谢少点也不占空间。查询慢
数字:
tinyint,int 为整数类型
float,double 为小数类型
numeric(5,2) decimal(5,2) 也表示小数,一共五位,其中可以有两位小数
decimal和numeric 表示精确的整数数字
日期:
date 包含年月日
time 时分秒
datetime 包含年月日和时分秒
timestamp 时间戳,不是日期,而是从1970年1月1号到指定日期的毫秒数
create database cc2024 ctarset utf8;创建数据库,避免中文乱码
show databases;查看所有数据库
use cc2024;使用数据库
create table oop(创建oop表
id int primary key auto_increment,id主键自增
name varchar(11) not null,name非空
primp varchar(111) unique));primp唯一
show tables;查看所有表
alter table oop add column lili double;插入列,列名lili 类型double
desc oop;查看表的结构
insert into oop values(null,"daada","ddfafaw");往表中插入数据
update oop set name = '张三' where id = 1;根据id为1的列,来修改name的值。修改单个值,/覆盖
drop database cc2024;删除cc2024数据库
drop table oop;删除表
select * from oop;查看表中所有数据
delete from oop where id=2;删除id为2的列
selete * from oop order by name;按照name排序
select count(*) from oop;查看oop一共多少列
select 'ABC',lower('ABC') from oop;转小写
select upper(name) from oop;转大写
select length(name) from oop;求长度
select name,substr(name,1,3) from oop;截取name列中的字符长度
select name,coucat(name,'123') x from oop;拼接123
select name,replace(name,'a','666')xfrom oop;把a替换成666
select ifnull(name,'lll') name from oop;判断是否为null,如果是将null替换lll
select id,round(id) from oop;向上取整
select id,ceil(id),from oop;向下取整
select now();当前时间包含年月日时分秒
select curdate();当前年月日
select curtime();当前时分秒
select distinct name from oop;去重
select * from oop where id = 1;判断id为1的所有信息
select * from oop where name like "%a%";判断name中包含a的所有信息
select * from oop where name is null;显示name中为空的所有信息
select * from oop where name is not null;显示name中所有不为空的
select * from oop where name between 300 and 600;判断name中在300~600之间的所有信息
select * from oop limit 2,6;显示从第2条开始展示6条的所有信息
select max(id) from oop;求id的最大值
select min(id) from oop;求id的最小值
select count(*) from oop;求oop中的所有列的和,有几列打印几个数字
select sum(id) from oop;求id的和,这个和是所有数字的和
select avg(id) from oop;求id的平均数
select name,max(id) from oop group by name;分组,分组分的都是非聚合数,如果出现混合列,就必须分组
select name,max(id) from oop group by name having 判断条件;分完组之后再判断就需要使用having
事物:简单的来说事物就是将一堆SQL语句绑定在一起操作,要么都执行成功,要么都失败,就是全部执行成功才算成功,否则就会恢复到SQL执行前的状态
四大特性(ACIS)
-
原子性:一个事物中的所有操作要么全部成功,要么全部失败。如果出现错误就会被滚回事物之前的状态
-
一致性:在事物开始和事物结束,数据库的完整性没有被破坏
-
隔离性:数据库可以允许多个并发事物同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
-
持久性:事物结束后,对数据的修改是永久的,就是系统故障数据也不会丢失
事务没有固定的代码,每回的增删改都是一次事务
commit; 提交
rollback; 回滚
constraints;约束
unique; 唯一
foreign key; 外键约束
default;默认约束 默认值
索引 index
可以快速搜索,快速查找。缺点也很明显:它会产生许多共同的数据,会产生冗余的情况,数据库经过增删改之后索引也要跟着改变,要不然数据会不精确。索引最多添加5条
分类
单值索引:一个索引只包括一个列,一个表可以有多个列
唯一索引:索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引
复合索引:一个索引同时包括多列
show index from dept; 查看dept中的所有索引
create index 索引名字 on 表名(字段名);一个普通索引就创好了
create index loc_index on dept(loc);这个就是loc表的索引,搜索loc的话,速度会快
create unique index 索引名 on 表名(字段名);一个唯一索引就创好了
create unique index loc_index on dept(loc);这个就是loc表的唯一索引,搜索loc的话,速度会快
如果希望索引不止一列,可以用复合索引,中间用逗号隔开
create index 索引名 on 表名(字段1,字段2);一个复合索引就创好了
create index pindex on persons(lastname,firstname);这个就是persons表的唯一索引,搜索lastname,firstname的话,速度会快
alter table dept drop index loc_index;删除loc_index的索引
复合索引需要遵顼一个最左特性。当我们创建一个联合索引(复合索引)的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)、(k1,k3)和(k1,k2,k3)索引,这就是最左匹配原则,也称为最左特性
优点:
-
索引是数据库优化
-
表的主键会默认自动创建索引
-
每个字段都可以被索引
-
大量降低数据库的IO磁盘读写成本,极大提高了检索速度
-
索引事先对数据进行了排序,大大提高了查询效率
缺点:
-
索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
-
索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
-
虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件
-
随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引
视图view
可视化的表,视图是一张特殊的表,可以把上次执行的结果直接缓存到视图中。如果还想查看商会的结果,直接查看视图就可以了
create view emp_view as select * from emp where ename like "%a%"; 前边是创建视图,后面跟的是一个SQL语句,这样执行的话,一个视图就创建好了
select * from emp_view;使用视图,直接使用,方便
多表联查
select * from dept,emp where dept.deptno=emp.deptno and dept.dname="accounting";笛卡尔积查询,查询语句后面直接写两张表,中间用逗号隔开,where是找两张表相同的列名,建立连接,and是业务条件,要找什么东西
select * from dept join emp on dept.deptno=emp.deptno where dept.dname="accounting";连接查询,查询语句后面写两张表,中间用join隔开,on是找两张表相同的列名,建立连接,where是业务条件,要找什么东西
select ename from emp where deptno =( select deptno from dept where loc='二区' );子查询,又称嵌套查询,先写要查询的东西,where后面写上两张表的相同点,然后=() 等号=是建立连接,括号内写另一张表的内容,注意查询的东西需要是两张表都有的,然后where后面是条件
数据库优化
如果不是非必要,尽量不要用select *,尽量用具体字段
如果不是非必要,避免在where中使用or来连接,or是或者的意思查询的更多,
尽量使用varchar,而不是char。varchar是按照实际内存存储的,可以节省空间,char是直接声明大小,不足的用空格代替
尽量使用数值代替字符串。数值所占的空间更少
查询避免返回大量数据,如何确实数据量大,可以采用分页。删除同理
如果使用like,可以把查询的条件放在前边,而不是中间和后边
索引不易太多,一般五个之内,索引不适合建立在有大量重复数据的字段上。
查询条件越精细越好
多表联查不要超过5个,表越多时间开销就越大