<
MySQL
>
上一篇

BitMap
下一篇

markdown

##数据库的四大特性(ACID)

数据库的四大特性是:原子性、一致性、隔离性、持久性

(1)原子性:事务包含的所有操作,要么都成功,要么都失败回滚。

(2)一致性:事务开始和结束时必须保持一致。若A和B两个账户一共有200元,无论双方怎么转账,最后二者账户的钱一共还是200元。

(3)隔离性:针对多个用户访问一个数据库,操作同一张表的时候,数据库为每个用户开启的事务互相之间不影响。对于事务T1来说,事务T2要么在T1执行前执行,要么在T1执行之后执行, T1感觉不到其他有其他事务并发执行。事务隔离性有多种隔离机制。

(4)持久性:一个事务一旦被提交,对数据库的操作就是永久的,无论数据库是否遇到故障,都不会丢失事务提交这个操作。

事务隔离性的隔离机制:

for me: 事务设置在service层(@Transactional(readOnly = true/false))

mysql的#与$的区别

(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)一般能用#,则不用$

sql语句优化

(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)一个表中创建复合索引(又叫联合索引),要考虑到索引的顺序(符合最左原则)。复合索引就想电话薄,是姓氏和名字组成,如果知道姓氏好找,知道姓氏和名字更好找,但是只知道名字,索引是没有用处的

mysql字段类型

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.整数:

sql方法

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的分库分表

简单做下自我介绍(时间两分钟左右) mysql优化, 说说某个项目,在项目中解决过的问题,重点难点

说下自己优点缺点,离职原因 职业规划, 有啥想问我们的嘛?(如果我入职了,工作内容是什么,哪方面什么业务)

Top
Foot