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. 将字段内容很多的字段单独拆解一个表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章