MyISAM与InnoDB存储引擎性能比较

简介

存储引擎 desc
MyISAM 高速引擎,查询速度快,但不支持事务
InnoDB 5.5版本后MySql默认数据库,支持事务和行级锁,速度比MyISAM慢
- InnoDB MyISAM
存储文件 .frm 表定义文件.ibd 数据文件和索引文件 .frm 表定义文件 .myd 数据文件 .myi 索引文件
表锁、行锁 表锁
事务 支持 不支持
CRUD 读、写 读多
count查询 扫表 有专门存储的地方
索引结构 B+Tree B+Tree
索引类型 聚簇索引:数据和索引在一起 非聚簇索引:数据和索引分开
叶子节点 记录完整的数据 记录数据的地址值

性能分析思路

  1. 首先使用【慢查询日志】功能,去获取所有查询时间比较长的sql
  2. 其次【查看执行计划】查看有问题的sql执行计划
  3. 最后使用【show profiles[s]】 查看有问题的sql性能使用个情况
  4. 具体步骤:
  5. 打开mysql命令行:show variables like ‘%slow%’; set global slow_query_log = 1
  6. 打开mysql命令行:show variables like ‘%profiling%’;
  7. set profiling = 1;
  8. 执行sql:show profiles; 获取id
  9. 执行sql:show profile all for query (id)

索引思路

索引有什么用

  1. 高效获取数据的数据结构
  2. 使用b+tree结构
  3. 索引是存储在磁盘文件中的(MyISAM 存储在单独的.myi文件,InnoDB存储在数据文件一起.ibd)

聚簇索引(Cluster Index) InnoDB

InnoDB存储引擎的数据组织方式是聚簇索引表:完整的记录存储在主键索引中,通过主键索引就可以获取记录所有的列,也就表数据和索引是在一起的。

索引的优势和劣势

优势

  1. 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录
  2. 通过索引列对数据进行排序,降低数据排序成本,降低cpu消耗

劣势

  1. 占用磁盘空间
  2. 虽然能提高查询效率,但是会降低更新数据的效率

关于主键索引和辅助索引(次要索引)

InnoDB(聚簇索引cluster index)

主键索引:叶子节点会存储数据行,
辅助索引:叶子节点会存储主键值,然后再通过主键值进行数据检索,会进行二次索引。

MyISAM非聚簇索引

主键索引:叶子节点会存储数据地址值
辅助索引:叶子节点也会存储数据地址值

多使用组合索引

  1. 常出现在where条件中的列,用组合索引,至于组合索引中的顺序很重要,需要匹配最左前缀原则,但是由于mysql中存在查询优化器,所以书写的sql条件顺序不一定是执行时候的where条件顺序
  2. 常出现在order by 和group by语句中的列,最后按照顺序去创建组合索引
  3. 常出现在select 语句中的列,建议按照顺序创建组合索引,多用覆盖索引,少用*作为结果
  4. 最左匹配原则,mysql会一直向右匹配直到遇到范围查询(>,<,between,like,%,or)就停止匹配
  5. = 和 in 可以乱序,比如 a = 1 and b=2 and c= 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会优化成索引可以识别的形式

EXPLAIN sql性能分析

  1. id
  2. select_type
  3. table
  4. partitions
  5. type:system,const,eq_ref,ref,fulltext,ref_or_null,nuique_subquery,index_subquery,range,index_merge,index,all(除了all 都用到了索引,除了index_merge其他只可以用到一个索引,最少要用到range级别)
  6. possible_keys 此次查询中可能选中到的索引数量
  7. key
  8. ref
  9. rows 估算的扫描行数(innodb不是精确值,myisam是精确值)
  10. filtered
  11. extra

mysql性能优化

  1. 将数据保存到内存中,保证从内存读取数据
  2. 内存预热
  3. 设计中间表
  4. 减少关联查询,创建合理的冗余字段
  5. 字段太多时,考虑垂直拆表
  6. 将字段内容很多的字段单独拆解一个表

你可能感兴趣的:(学习专栏,Java面试)