1.建表的几点建议
- 不要用外键、触发器、视图
- 降低了可读性;
- 影响数据库性能,应该把把计算的事情交给程序,数据库专心做存储;
- 数据的完整性应该在程序中检查
- 关于大文件存储:
- 不要用数据库存储图片(比如base64编码)或者大文件;
- 把文件放在 NAS 上,数据库只需要存储URI(相对路径),在应用中配置 NAS 服务器地址。
- 关于表拆分:
- 将不常用的字段拆分出去,避免列数过多和数据量过大。
- 比如在业务系统中,要记录所有接收和发送的消息,这个消息是 XML 格式的,用 blob 或者 text 存储,用来追踪和判断重复,可以建立一张表专门用来存储报文。
2.存储引擎的选择
为不同的业务表选择不同的存储引擎,例如:
- 查询插入操作多的业务表,用 MyISAM。
- 临时数据用 Memeroy。
- 常规的并发大更新多的表用 InnoDB。
MyISAM(3 个文件)
应用范围比较小。表级锁定限制了读/写的性能,因此在Web 和数据仓库配置中,它通常用于只读或以读为主的工作。
-
支持表级别的锁(插入和更新会锁表)。不支持事务
-
拥有较高的插入(insert)和查询(select)速度
-
存储了表的行数(count速度更快)。(怎么快速向数据库插入100万条数据?我们有一种先用MyISAM插入数据,然后修改存储引擎为InnoDB的操作)
-
适用:只读之类的数据分析的项目
InnoDB(2 个文件)
mysql5.7中的默认存储引擎。 InnoDB是一个事务安全(与ACID兼容)的MySQL存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。InnoDB行级锁(不升级为更粗粒度的锁)和Oracle风格的一致非锁读提高了多用户并发性和性能。InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I/O。为了保持数据完整性,InnoDB还支持外键引用完整性约束。
-
支持事务,支持外键,因此数据的完整性、一致性更高
-
支持行级别的锁和表级别的锁
扫描二维码关注公众号,回复: 12648064 查看本文章 -
支持读写并发,写不阻塞读(MVCC)
-
特殊的索引存放方式,可以减少IO,提升查询效率
-
适用:经常更新的表,存在并发读写或者有事务处理的业务系统
Memory(1 个文件)
将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中快速访问。这个引擎以前被称为堆引擎。其使用案例正在减少; InnoDB及其缓冲池内存区域提供了一种通用、持久的方法来将大部分或所有数据保存在内存中,而ndbcluster为大型分布式数据集提供了快速的键值查找。
- 把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。只适合做临时表。
- 将表中的数据存储到内存中
CSV(3 个文件)
它的表实际上是带有逗号分隔值的文本文件。 csv表允许以csv格式导入或转储数据,以便与读写相同格式的脚本和应用程序交换数据。因为csv 表没有索引,所以通常在正常操作期间将数据保存在innodb表中,并且只在导入或导出阶段使用csv表。
不允许空行,不支持索引。格式通用,可以直接编辑,适合在不同数据库之间导入导出。
Archive(2 个文件)
这些紧凑的未索引的表用于存储和检索大量很少引用的历史、存档或安全审计信息。
不支持索引,不支持update delete.