环境
- MySQL 5.7.13
MySQL 主要存储引擎
特性/引擎 | MyISAM | Aria | InnoDB | XtraDB | Memory | Archive | |
---|---|---|---|---|---|---|---|
数据存储 | 传统顺序数据储存 | 传统顺序数据储存 | 表空间存储方式 | 表空间存储方式 | |||
事务支持 | 不支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | |
外键 | 不支持 | 不支持 | 支持 | 支持 | 不支持 | 不支持 | |
全文检索 | 支持 | 支持 | 5.6 之后支持 | 5.6 之后支持 | |||
锁级别 | 表级锁 | 表级锁 | 行级锁 | 行级锁 | 表级锁 | 行级锁 | |
Count 速度 | 快 | 快 | 慢 | 慢 | |||
适合业务 | 读多写少、单表数据量小于 1 KW | 读多写少、单表数据量小于 1 KW | 读写均衡、数据量不限 | 读写均衡、数据量不限 | |||
可用版本 | MySQL、MariaDB、Percona | MariaDB | MySQL、MariaDB、Percona | MariaDB、Percona | |||
其他说明 | 传统顺序索引数据库,适合读多写少小数据量业务 | MyISAM 增强版,性能更好 | 适合高压力高性能的业务模型 | InnoDB 增强版 |
MySQL 索引定义
MySQL 的索引(Index)是帮助 MySQL 高效获取数据的数据结构
MySQL 索引类型
- Normal
- 普通索引,对存储的数值没有任何限制
- Unique
- 唯一索引,不允许数值重复,但允许空值
- Primary
- 主键索引,是一种特殊的唯一索引,不允许存在数值重复或空值
- Spatial(R-Tree)
- GIS 相关空间查询使用索引数据结构。
- Fulltext
- 主要用于全文检索,目前只有 MyISAM 和 MySQL 5.6 + 的 InnoDB 支持;目前只支持英文。
MySQL 索引方法
- B+Tree
- 可用于排序的索引数据结构,可应用于 =,>,< 等各个范围查询,并且可以排序
- 时间复杂度:O(log2N)
- Hash
- 只能用于 =,IN 等操作,无法进行范围操作,Key 冲突严重情况下可能性能比 B-Tree 低下
- 时间复杂度:O(1)
MyISAM 索引结构:B+ Tree
- MyISAM 主索引和辅助索引
- 区别在于:主索引 Key 是唯一;辅助索引 Key 可以重复
- MyISAM 为非聚簇索引
InnoDB 索引结构:B+ Tree
- InnoDB 主索引和辅助索引
- InnoDB 的主索引是聚簇索引,数据和 Key 本身都会存储在 B+Tree 的叶子节点
- InnoDB 的辅助索引本身主要是记录主索引的 Key,最终查找数据还是从辅助索引再去主索引查找
- InnoDB 为聚簇索引
存储引擎及版本选择
结论:
- 使用 InnoDB 于生产环境
- 使用 MySQL 5.5+ 于生产环境
原因:
- 更稳定可靠的数据存储和索引结构;整个存储引擎设计思想更可靠先进,接近于Oracle、SQL Server级别的数据库(有兴趣可以去阅读源码了解细节)
- 更多可靠特性支持,比如事务、外键等支持(支付等关键领域事务非常重要)
- 运行更稳定,不论读写数据的量级,都能够保证比较稳定的性能响应
- 更好地崩溃恢复机制,特别利用一些Percona的一些工具,更有效运维InnoDB
- MySQL 5.5+ 对比 MySQL 5.1.x 总体功能和性能提升太多,改进太多