简介
存储引擎 | desc |
---|---|
MyISAM | 高速引擎,查询速度快,但不支持事务 |
InnoDB | 5.5版本后MySql默认数据库,支持事务和行级锁,速度比MyISAM慢 |
- | InnoDB | MyISAM |
---|---|---|
存储文件 | .frm 表定义文件.ibd 数据文件和索引文件 | .frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | 支持 | 不支持 |
CRUD | 读、写 | 读多 |
count查询 | 扫表 | 有专门存储的地方 |
索引结构 | B+Tree | B+Tree |
索引类型 | 聚簇索引:数据和索引在一起 | 非聚簇索引:数据和索引分开 |
叶子节点 | 记录完整的数据 | 记录数据的地址值 |
性能分析思路
- 首先使用【慢查询日志】功能,去获取所有查询时间比较长的sql
- 其次【查看执行计划】查看有问题的sql执行计划
- 最后使用【show profiles[s]】 查看有问题的sql性能使用个情况
- 具体步骤:
- 打开mysql命令行:show variables like ‘%slow%’; set global slow_query_log = 1
- 打开mysql命令行:show variables like ‘%profiling%’;
- set profiling = 1;
- 执行sql:show profiles; 获取id
- 执行sql:show profile all for query (id)
索引思路
索引有什么用
- 高效获取数据的数据结构
- 使用b+tree结构
- 索引是存储在磁盘文件中的(MyISAM 存储在单独的.myi文件,InnoDB存储在数据文件一起.ibd)
聚簇索引(Cluster Index) InnoDB
InnoDB存储引擎的数据组织方式是聚簇索引表:完整的记录存储在主键索引中,通过主键索引就可以获取记录所有的列,也就表数据和索引是在一起的。
索引的优势和劣势
优势
- 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录
- 通过索引列对数据进行排序,降低数据排序成本,降低cpu消耗
劣势
- 占用磁盘空间
- 虽然能提高查询效率,但是会降低更新数据的效率
关于主键索引和辅助索引(次要索引)
InnoDB(聚簇索引cluster index)
主键索引:叶子节点会存储数据行,
辅助索引:叶子节点会存储主键值,然后再通过主键值进行数据检索,会进行二次索引。
MyISAM非聚簇索引
主键索引:叶子节点会存储数据地址值
辅助索引:叶子节点也会存储数据地址值
多使用组合索引
- 常出现在where条件中的列,用组合索引,至于组合索引中的顺序很重要,需要匹配最左前缀原则,但是由于mysql中存在查询优化器,所以书写的sql条件顺序不一定是执行时候的where条件顺序
- 常出现在order by 和group by语句中的列,最后按照顺序去创建组合索引
- 常出现在select 语句中的列,建议按照顺序创建组合索引,多用覆盖索引,少用*作为结果
- 最左匹配原则,mysql会一直向右匹配直到遇到范围查询(>,<,between,like,%,or)就停止匹配
- = 和 in 可以乱序,比如 a = 1 and b=2 and c= 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会优化成索引可以识别的形式
EXPLAIN sql性能分析
- id
- select_type
- table
- partitions
- type:system,const,eq_ref,ref,fulltext,ref_or_null,nuique_subquery,index_subquery,range,index_merge,index,all(除了all 都用到了索引,除了index_merge其他只可以用到一个索引,最少要用到range级别)
- possible_keys 此次查询中可能选中到的索引数量
- key
- ref
- rows 估算的扫描行数(innodb不是精确值,myisam是精确值)
- filtered
- extra
mysql性能优化
- 将数据保存到内存中,保证从内存读取数据
- 内存预热
- 设计中间表
- 减少关联查询,创建合理的冗余字段
- 字段太多时,考虑垂直拆表
- 将字段内容很多的字段单独拆解一个表