Fork me on GitHub

mysql优化

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’

5.in 和 not in 也要慎用,否则会导致全表扫描 对于连续的数值,能用 between 就不要用 in 了

6.模糊查询会导致索引失效,必要时可以采用搜索引擎

7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

8.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

9.任何地方都不要使用 select from t ,用具体的字段列表代替“”,不要返回用不到的任何字段

10.使用连接(JOIN)来代替子查询


数据库优化:

1.选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小

2.使用索引,外键,数据量太大的话可以考虑使用redis

3.以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;

Mysql的事务处理

数据库的事务特性

1.原子性:要么全部成功,要么全部失败

2.一致性:比如存取钱,钱的总数一定是一致的

3.隔离性:在并发条件下,两次事务之间是需要隔离的

4.持久性:当一次事务提交了后,这条数据就被持久化了。