说说
MyBatis
的优点和缺点?
优点:
(
1
)基于
SQL
语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,
SQL
写
在
XML
里,解除
sql
与程序代码的耦合,便于统一管理;提供
XML
标签,支持编写动态
SQL
语句,并
可重用。
(
2
)与
JDBC
相比,减少了
50%
以上的代码量,消除了
JDBC
大量冗余的代码,不需要手动开关连
接;
(
3
)很好的与各种数据库兼容(因为
MyBatis
使用
JDBC
来连接数据库,所以只要
JDBC
支持的数据
库
MyBatis
都支持)。
(
4
)能够与
Spring
很好的集成;
(
5
)提供映射标签,支持对象与数据库的
ORM
字段关系映射;提供对象关系映射标签,支持对象
关系组件维护。
缺点
(
1
)
SQL
语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写
SQL
语句的功底有
一定要求。
(
2
)
SQL
语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
说说
InnoDB
与
MyISAM
的区别
?
1. InnoDB
支持事务,
MyISAM
不支持,对于
InnoDB
每一条
SQL
语言都默认封装成事务,自动提
交,这样会影响速度,所以最好把多条
SQL
语言放在
begin
和
commit
之间,组成一个事务;
2. InnoDB
支持外键,而
MyISAM
不支持。对一个包含外键的
InnoDB
表转为
MYISAM
会失败;
3. InnoDB
是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该
过大,因为主键太大,其他索引也都会很大。而
MyISAM
是非聚集索引,数据文件是分离的,
索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4. InnoDB
不保存表的具体行数,执行
select count(*) from table
时需要全表扫描。而
MyISAM
用
一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5. Innodb
不支持全文索引,而
MyISAM
支持全文索引,查询效率上
MyISAM
要高;
SQL
优化手段有哪些?
1
、查询语句中不要使用
select *
2
、尽量减少子查询,使用关联查询(
left join,right join,inner join
)替代
3
、减少使用
IN
或者
NOT IN ,
使用
exists
,
not exists
或者关联查询语句替代
4
、
or
的查询尽量用
union
或者
union all
代替
(
在确认没有重复数据或者不用剔除重复数据时,
union all
会更好
)
5
、应尽量避免在
where
子句中使用
!=
或
<>
操作符,否则将引擎放弃使用索引而进行全表扫描。
6
、应尽量避免在
where
子句中对字段进行
null
值判断,否则将导致引擎放弃使用索引而进行全表
扫描,如:
select id from t where num is null
可以在
num
上设置默认值
0
,确保表中
num
列没有
null
值,然后这样查询:
select id from t where num=0
并发事务带来哪些问题
?
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对
同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
脏读(
Dirty read
)
:
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提
交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是
还没有提交的数据,那么另外一个事务读到的这个数据是
“
脏数据
”
,依据
“
脏数据
”
所做的操作可
能是不正确的。
丢失修改(
Lost to modify
)
:
指在一个事务读取一个数据时,另外一个事务也访问了该数
据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务
内的修改结果就被丢失,因此称为丢失修改。 例如:事务
1
读取某表中的数据
A=20
,事务
2
也
读取
A=20
,事务
1
修改
A=A-1
,事务
2
也修改
A=A-1
,最终结果
A=19
,事务
1
的修改被丢失。
不可重复读(
Unrepeatableread
)
:
指在一个事务内多次读同一数据。在这个事务还没有结
束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务
的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数
据是不一样的情况,因此称为不可重复读。
幻读(
Phantom read
)
:
幻读与不可重复读类似。它发生在一个事务(
T1
)读取了几行数
据,接着另一个并发事务(
T2
)插入了一些数据时。在随后的查询中,第一个事务(
T1
)就会
发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复读和幻读区别:
隔离级别
脏读
不可重复读
幻影读
READ-UNCOMMITTED
√
√
√
READ-COMMITTED
×
√
√
REPEATABLE-READ
×
×
√
SERIALIZABLE
×
×
×
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增
或者删除比如多次读取一条记录发现记录增多或减少了。