Mysql优化
Mysql的数据库引擎:
5.5版本之前默认的存储引擎为MyISAM(性能快,但不支持事务处理,支持表级锁,不支持外键)
5.5版本之后使用InnoDB存储引擎(支持事务处理和行锁)
注:有雨MyISAM性能快,如果大量的使用查询语句可以使用其作为存储引擎,否则使用InnoDB
数据库的行锁:
在执行一条事务的时候数据库无法被另外一个事务给改变。
数据库事务的4种隔离级别:
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
其他数据库默认的隔离级别为 Read commited
mysql数据库默认的隔离级别为 repeatable Read
数据库的隔离级别
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
脏读
指的是一个事务中读取了另外一个事务修改了但没有提交的数据
不可重复读
指的是一个事务在读取了一条数据时,另外一个事务修改了这个数据,再次读取的时候这条数据就不同了。
理论上来说不可重复读并不算是一个错误的情况,因为本来就应该读取到最后一条修改后的数据
幻读
其实和不可重复读是差不多的情况。同一个事务两次读取之间,会有另外一个事务参与进来修改了数据。
例如:查询10条姓名有冯的,然后修改了一条,现在理论上来说是9条,但是在再次查询之前,另外一个事务提交了一条姓名中包含冯字的。此时再次查询则还是有10条数据,就以为出现了幻觉 就是幻读。
sql语句优化:
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
例:select id from t where num=10 or Name = ‘admin’
可以这样查询:
select id from t where num = 10
union all
select id from t where Name = ‘admin’