发表于: 2019-12-26 22:56:54

2 1084


今天做了什么:

看了mysql知识点和sql优化.

以及mybatis常见特性


收获:

sql优化:
关键词:全表扫描
字段:
尽量用数字型字段代替字符型
尽量将字段设为not null
1.避免使用select *
并考虑在 where 及 order by 涉及的列上建立索引
单表索引数量不应超过5
在where子句中:
2.慎用!=或<>
避免进行表达式和函数操作
3.慎用or连接条件
4.慎用in 和 not in
5.慎用类似'%abc%'的模糊搜索
6.尽量使用join代替子查询
mysql数据库:
myisam与innodb:

外键全表扫描
myisam不支持表锁
innodb支持行锁
varchr与char区别:
1.char固定长度,varchar长度可变
2.char最多能存放的字符个数255,编码无关,varchar最多能存放65532个字符
索引分类
  • 聚簇: 数据按索引顺序存储,中子结点存储真实的物理数据
  • 非聚簇: 存储指向真正数据行的指针
索引的数据结构
  • 红黑树:写操作时会频繁调整,性能低
  • B(-)树: 查询性能不稳定,查询结果高度不一致
  • B+树:相对更矮更宽,查询层次浅
主从复制与读写分离
在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
我们可以在主服务器创建一个数据库用户(出于安全,根据需求给予相应的权限)主要用于写操作,在程序中通过这一用户连接主数据库的只用于写操作而不用读操作。
在从服务器上创建一个数据库用户(出于安全,只给予读select的权限)主要用于读操作,在程序中通过这一用户连接从数据库即可。
也可以找一个组件来完成mysql_proxy实现SQL语句的路由,这样就不需要我们在程序上关注哪个数据库是写,哪个数据库是读的了。


Mybatis:

什么是mybatis的接口绑定
是把接口里的方法和sql语句绑定,然后直接调用接口方法即可
接口绑定的方式:注解,通过xml
两种方式的优劣和使用场景:取决于sql语句的复杂程度.一般使用xml
mysql的动态sql
主要是if节点,配合where,trim等节点.OGNL语法. 
模糊查询怎么写
sql拼接通配符 "%"#{value}"%",会引起sql注入
java代码中添加sql通配符
string name = “%smi%”;
list<student> list = mapper.selectlike(name);
<select id=”selectlike”>
     select * from student where name like #{value}
</select>
一个xml映射文件对应一个dao接口,工作原理是怎样的
映射文件中namespace值指向接口全限定名.mapper的statement的id值指向接口的方法名.接口方法的参数就是传递给sql的参数.
当调用接口方法时,接口全限定名+方法名作为key可唯一定位一个MapperStatemen,在mybatis中,每一个<select>,<insert>等标签都会被解析为一个MapperStatement对象
例如, com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面 id 为 findStudentById 的 MapperStatement
mapper里的方法不能重载.
mapper接口的原理是JDK动态代理,mybatis运行时会使用JDK动态代理为mapper接口生成代理对象proxy,代理对象拦截接口方法,转而执行MapperStatement代表的sql
mybatis如何将sql执行结果封装为目标对象并返回的,有哪些映射形式
使用<resultMap>标签,逐一定义数据库列名和对象属性名的映射关系
使用sql列别名功能,将列别名写成对象属性名
定义好列名与属性名的映射关系后,mybatis通过反射创建对象,同时使用反射给属性赋值并返回. 找不到映射关系的属性就无法赋值
mybatis缓存
分为一级缓存和二级缓存.
一级缓存存储作用域是session,flush或close后所有cache就清空.默认打开.
二级缓存存储作用域是namespace里,并且可以自定义存储源,默认不打开.使用二级缓存属性类需要实现serializable接口,可在配置文件中配置<cache/>
#和$区别
#是预编译处理,$是字符串替换
处理时会将sql中的#{}替换为? ,调用preparedStatement的set方法来复制
处理$时会将其替换为变量的值.


问题

1.同时用redis和pageHelper会冲突
解决方法是要么手写分页,要么在controller层做缓存,但不规范
明天的计划
了解下spring的事务.深入学习mvc.



返回列表 返回列表
评论

    分享到