1. MySQL常用命令
1) mysql -h 主机名 -u 用户名 -p;登陆mysql
2) create database name; 创建数据库
3) use databasename; 选择数据库
4) drop database name 直接删除数据库,不提醒
5) show tables; 显示表
6) describe tablename; 表的详细描述
7) select 中加上distinct去除重复字段
8) mysqladmin drop database name 删除数据库前,有提示。
9) 显示当前mysql版本和当前日期,时间select version(),current_date,now();
10) 增加新用户
格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”
GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY ’something’ WITH GRANT OPTION;
11) 删除授权:
mysql> revoke all privileges on *.* from root@”%”;
mysql> delete from user where user=”root” and host=”%”;
mysql> flush privileges;
创建一个用户custom在特定客户端it363.com登录,可访问特定数据库fangchandb
mysql >grant select, insert, update, delete, create,drop on fangchandb.* to custom@ it363.com identified by ‘ passwd’
12) 修改列的类型
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
alter table table1 change id sid int unsigned;
13) 创建索引 create unique index ind_id on table1 (id);//建立唯一性索引
14) 删除索引. drop index idx_id on table1;
15) 联合字符或者多个列(将列id与":"和列name和"="连接)
select concat(id,':',name,'=') from students;
16) limit(选出10到20条)<第一个记录集的编号是0>
select * from students order by id limit 9,10;
2. 索引
数据库索引,是数据库管理系统 中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
索引优点
1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引缺点
1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
建议创建索引列
1)在经常需要搜索的列上,可以加快搜索的速度;
2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
5)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不建议创建索引列
1) 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2) 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3) 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
4) 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因 此,当修改性能远远大于检索性能时,不应该创建索引。
3. 存储引擎
https://blog.csdn.net/kobejayandy/article/details/51064268
4. 隔离级别
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)是 是 是
不可重复读(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否
1)脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据
2)不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
3)幻读是事务非独立执行时发生的一种现象
https://www.cnblogs.com/fjdingsd/p/5273008.html
5. 数据库事务ACDI四个要素
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
6. 隔离性进一步理解
7. 视图和表的区别联系
区别:1)视图是已经编译好的sql语句。而表不是
2)视图没有实际的物理记录。而表有。
3)表是内容,视图是窗口
4)表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5)表是内模式,视图是外模式
6)视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8)视图的建立和删除只影响视图本身,不影响对应的基本表。
9)视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
8. drop,delete与truncate的区别
drop直接删掉表;truncate删除表中数据,再插入时自增长id又从1开始 ;delete删除表中数据,可以加where字句。
1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
3) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
4) TRUNCATE 和DELETE只删除数据,而不删除表的结构(定义);而DROP则删除整个表(结构和数据),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
5) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。 truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
6) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或想触发trigger,还是用delete。
7) Truncate table 表名 速度快,而且效率高,因为:truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
8) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
9) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
9. 连接种类
外连接
1)左连接:left join 或 left outer join
select * from table1 left join table2 on table1.id=table2.id
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
2)右连接:right join 或 right outer join
select * from table1 right join table2 on table1.id=table2.id
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
3)完整外部联接:full join 或 full outer join
select * from table1 full join table2 on table1.id=table2.id
注释:返回左右连接的和(见上左、右连接)
内连接:join 或 inner join只返回符合条件的table1和table2的列
select * from table1 join table2 on table1.id=table2.id
等价:1)select a.*,b.* from table1 a,table2 b where a.id=b.id
2)select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
交叉连接(完全)
1) 概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
select * from table1 cross join table2
2) 等价(与下列执行效果相同)
select * from table1,table2
10. 数据库优化的思路
SQL语句优化
1)选取最适用的字段属性。设置合适表中字段的宽度,尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多
2)使用连接(JOIN)来代替子查询
3)使用联合(UNION)来代替手动创建的临时表
4) 使用事务保证数据一致性和完整性
5)锁定表
6)使用外键
7)使用索引
8)优化sql语句
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
索引优化
看上文索引
https://blog.csdn.net/suifeng3051/article/details/52669644
数据库结构优化
1)范式优化: 比如消除冗余(节省空间。。)
2)反范式优化:比如适当加冗余等(减少join)
3)拆分表: 垂直拆分和水平拆分
服务器硬件优化
11. 存储过程与触发器的区别
两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。
触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,存储过程可以通过存储过程名称名字而直接调用。
存储过程的优点:
执行速度更快---因为存储过程是预编译过的
模块化程序设计—类似方法的复用
提高系统的安全性—防止SQL注入
减少网络流量—只需传输存储过程的名称即可
12. change和modify区别
change 和modify都可以修改表的定义,不同的是change后要跟两个列名,modify一个就行;而change可以修改列名,modify不行。
13. 锁
锁分类:
1)共享锁:被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加共享锁。
2)排他锁: 被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
MyISAM和MEMORY存储引擎采用表级锁;BDB采用页面锁;InnoDB默认行级锁,也支持表级锁。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率最高,并发度最低
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度最高
页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;并发度一般
表级锁适合以查询为主,只有少量按索引条件更新数据的应用,如web应用
使用表锁时机:1)事务需要更新大部分或全部数据,表又很大,表锁提高事务执行速度
2) 事务涉及多个表,比较复杂,可能引起死锁,造成大量事务回滚
InnoDB减少锁冲突:
1)尽量用较低隔离级别
2)尽量使用索引访问数据,加锁更精确,减少锁冲突机会
3) 选择合理事务大小,小事务发生冲突几率小
4)显式加锁时,请求足够级别锁
5)不要申请超过实际需要锁级别
6)一些特定事务,使用表锁提高处理速度
14. JDBC中如何进行事务处理?
答:Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。
https://blog.csdn.net/zhugewendu/article/details/73550414
https://www.cnblogs.com/zhyunfe/p/6209074.html
https://blog.csdn.net/u013252072/article/details/52912385