数据库优化方案
- 首先,在设计数据库表结构的时候,对每个字段选择合适的数据类型,合适的数据类型对后续的运算以及存取起到很大的作用。(tinyint和int的案例)
- 项目上线之后,可以通过一些监控手段(Mybatis的插件、MySQL的慢查询日志等),获知哪些SQL执行速度较慢。针对性的对这些SQL进行相关优化。可以通过执行计划,分析SQL语句的执行方式,结合索引以及SQL语句的一些优化形式,对SQL的执行过程进行优化。(索引的原理与特点描述)
- 如果通过索引也没办法优化当前的SQL执行效率,可能是因为查询的数据量太大或者是本来表中的数据已经超过了索引能承受的范围。需要考虑是否通过分页解决,或者分库分表改变数据库的本来的结构。(分片规则、分库的原则)
- 通过硬件层面的优化,也能有效的对MySQL执行效率有很大的帮助,比如换成多核的CPU、更大的内存或者固态硬盘
Mybatis怎么查询多条数据?
- XML中只需
resultType
属性值为实体对象别名或全路径名。- mybatis会通过接口文件的返回值类型来判断返回的是集合还是对象。如果是对象,则按常规查询并返回;如果是List集合,mybatis则会将查询到的多条记录设置进集合中并返回。
怎么看MySQL的执行计划
- explain(EX普冷) select …………….(在相应的select前面加explain即可)
MySQL索引失效怎么办
- 范围查询, 右边的列不能使用索引, 否则右边的索引也会失效.
- 不要在索引上使用运算, 否则索引也会失效.
- 字符串不加引号, 造成索引失效.
- 尽量使用覆盖索引, 避免 select *, 这样能提高查询效率.
- 用 or 分割开的条件, 如果 or 前面的列有索引, or 后面的列没有索引, 那么查询的时 候前后索引都会失效,如果一定要用 or 查询, 可以考虑下 or 连接的条件列都加索引, 这样就不会失效了.
事务的隔离级别?
读未提交(read Uncommited):
- 在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读问题,在项目中基本不怎么用, 安全性太差;
读已提交(read commited):
- 这是大多数数据库默认的隔离级别,但是不是 MySQL 的默认隔离级别;这个隔离级别满足 了简单的隔离要求:一个事务只能看见已经提交事务所做的改变,所以会避免脏读问题;由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和虚读等问题(下面详细介绍这种问题,结合问题来理解隔离级别的含义);
可重复读(Repeatable(瑞匹乐博) read):
- 这是 MySQL的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取到一样的数据;不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当 用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
可串行化(serializable(C瑞尔奈斯博)):
- 事物的最高级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之, 它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,一 般为了提升程序的吞吐量不会采用这个;
主键和索引的区别?
主键
外键
索引
定义:
唯一标识一条记录,不能
MySQL面试题
于 2021-12-07 23:03:06 首次发布