##数据库的四大特性(ACID)
数据库的四大特性是:原子性、一致性、隔离性、持久性
(1)原子性:事务包含的所有操作,要么都成功,要么都失败回滚。
(2)一致性:事务开始和结束时必须保持一致。若A和B两个账户一共有200元,无论双方怎么转账,最后二者账户的钱一共还是200元。
(3)隔离性:针对多个用户访问一个数据库,操作同一张表的时候,数据库为每个用户开启的事务互相之间不影响。对于事务T1来说,事务T2要么在T1执行前执行,要么在T1执行之后执行, T1感觉不到其他有其他事务并发执行。事务隔离性有多种隔离机制。
(4)持久性:一个事务一旦被提交,对数据库的操作就是永久的,无论数据库是否遇到故障,都不会丢失事务提交这个操作。
事务隔离性的隔离机制:
for me: 事务设置在service层(@Transactional(readOnly = true/false))
(1)#可以防止sql注入,但是$不可以
eg: String password = "123 or 1=1 -- ";
1)select count(*) from User where password= #{password}--> password="123 or 1=1 --"
使用# ,这个结果是密码错误,查不到任何数据,防止了sql注入
2)select count(*) from User where password= ${password}--> password=123 or 1=1 --
相当于 password = 123 或者是1=1,结果是永真,两个--表明后面的语句被注释了,不起作用了。
(2)$一般用于传表名、列名等变量 ${tableName}、order by ${id}
(3)#传值是相当于数据加上双引号,而$是直接传值
eg: String id = "1,2";
id in #{id} --> id in "1,2"
id in ${id} --> id in 1,2
(4)一般能用#,则不用$
(1)在搜索字段建立合适的索引
(2)explain查询sql的执行计划,可以帮助查询分析sql的性能。主要是通过type、possiable_key查看性能。
type由好到坏依次的顺序是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
(3)如果只查询一条就用limit 1
(4)如果表连接用到了join,两个表相连接的字段最好是索引,且类型相同
(5)尽量避免使用select * ,应该是取什么就写哪个字段,否则取的越多效率越低,如果web服务器和数据库不在一台服务器上还会增加网络传输
(6)每张表设置一个id,最好是int类型,自增唯一
(7)使用limit 拆分查询条数,insert和delete操作都会锁表,表锁住别的操作都进不来了,如果访问量很高,可能会把服务器弄崩(子线程很多,读取文件,耗费资源)
(8)尽量使用inner join ,避免使用left join,inner join会自动选择小表作为驱动表,而left join会使用左面表为驱动表
(9)一个表中创建复合索引(又叫联合索引),要考虑到索引的顺序(符合最左原则)。复合索引就想电话薄,是姓氏和名字组成,如果知道姓氏好找,知道姓氏和名字更好找,但是只知道名字,索引是没有用处的
1.date、datetime、timestamp的时间显示格式
注意:datetime与timestamp的区别:
(1)显示范围不同:
timestamp存储的范围为:“1970-01-01 00:00:01.000000” 到 “2038-01-19 03:14:07.999999”;
datetime存储的范围为:“1000-01-01 00:00:00.000000” 到 “9999-12-31 23:59:59.999999”
(2)存储时间的方式不同
datatime设置的是什么时间就是什么时间;
timestamp则是把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。
(3)timestamp不能为null,且timestamp增改会跟操作时间保持一致(客户端经处理的当前时间)
2.varchar、char、text的字符串显示
注意:
(1)从mysql4.1开始,varchar(10)表示10个字符,无论是存放数字,utf8的汉字(每个汉字3个字节),都可以存储10个。
(2)在检索的时候,如果值的结尾有空格,char会去掉结尾的空格,而varchar会保留空格。
(3)查询速度char > varchar > text
3.整数:
1.FIND_IN_SET(str,strList):查询字段(strList)中包含(str)的结果,返回结果为null或记录
str:要查询的字符串 strList: 字段名 参数以“,”分隔 如 (1,2,6,8)
SELECT name FROM student WHERE FIND_IN_SET(id,(11,12))
2.group_cancat():行转列方法,将多行数据,转换成一列字符串的形式。
3.mybatis的insert,使用 useGeneratedKeys=”true” keyProperty=”id”,insert之后,实体bean的id会被赋值。
4.存储过程中mysql插入新数据之后可以使用SET in_Id = LAST_INSERT_ID(); 获取最后插入数据的id
注意:
(1)如果一次插入多条数据,返回第一个记录的id。
(2)如果先给a表插入数据,后又给b表插入数据,last_insert_id()的值会改变。
(3)产生的id每次连接后,保存到服务器中。所以说该函数向客户端返回的值,是该客户端的,与其他客户服务器无关,即使他们产生自己的last_insert_id()。
简单做下自我介绍(时间两分钟左右) mysql优化, 说说某个项目,在项目中解决过的问题,重点难点
说下自己优点缺点,离职原因 职业规划, 有啥想问我们的嘛?(如果我入职了,工作内容是什么,哪方面什么业务)