MySQL执行引擎对比与SQL优化

执行引擎

对于一个中级Java开发者来说SQL优化已经是面试必问了,而最近的一次面试也有问到MySQL执行引擎,还真有点答不上来,话不多说,活到老学到老,又是一波查漏补缺,不得不说路还长。

首先简单了解下MySQL执行引擎,首先MySQL执行引擎分类比较多,InnoDB(重要)、MyIsam(重要)、Memory、Mrg_Myisam、Blackhole等,虽然看着多,不过在日常学习和使用过程中只需要掌握InnoDB和MyIsam即可。

 

MySQL(我的是8.0版本)默认使用InnoDB(网上也有说默认为MyIASM,可能是版本问题),可以通过如下命令查看:

show table status from '数据库名';

修改执行引擎也比较方便,在my.ini配置文件中 修改配置,如图:MySQL执行引擎对比与SQL优化_第1张图片

也可以在创建表的时候指定,如下:

create table '表名'(   
    ...
)type='执行引擎名称';

 

下面对比InnoDB和MyISAM的区别:

1.InnoDB:

  • 优点:InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,设计目标是处理大容量数据库系统;
  • 缺点:不支持全文索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表;
  • 适用场景:经常更新的表,适合处理多重并发的更新请求,需要事务、外键;

插播下MySQL的4个事务隔离级别:

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读(read uncommitted) 最低级别,不读物理上顺坏的数据
已提交读(read committed) 语句级
可重复读(Repeatable red) 事务级
可序列化(Serializable) 最高级别,事务级

 查看数据库默认的隔离级别(我的是8.0版本):

show global variables WHERE variable_name='transaction_isolation'

2. MyISAM:

  • 优点:支持全文类型索引,索引和记录分开存储,并存储了表的行数,所以select count(*)效率很高(不加where);
  • 缺点:不支持数据库事务,更新操作需要锁定整个表,不支持行级锁和外键;
  • 适用场景:经常读取数据的场合,更新操作少;

 

SQL优化:

  1. 语句优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;
  2. 语句优化,用select field_1,field_2,field_3... form table代替select * from table;
  3. 语句优化,使用连接(JOIN)代替子查询;
  4. 语句优化,使用联合(UNION)代替手动创建的临时表;
  5. 建表优化,尽量减少字段宽度,使用ENUM存储固定数据,例如性别;
  6. 语句优化,避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;
  7. 建表优化,字段选用优先级,整形>date,time>enum,char>varchar>blob,text;
  8. 语句优化,尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描;
  9. 语句优化,尽量避免在 where 子句中使用in 和 not in,否则会导致全表扫描,连续的数值用between代替,以及使用exists;
  10. 语句优化,尽量使用全文检索代替like查询;
  11. 语句优化,Update语句尽量只set需要修改的字段,否则带来没必要的开销;
  12. 语句优化,数据量大时(1万以上)尽量避免使用,游标;
  13. 持续更新中。。。

你可能感兴趣的:(SQL基础)