🎉如何恰当选择引擎?
- 如果不需要事务,而且数据操作量大,论坛,可以用MyISAM
- 需要强事务,做电商、支付、金融这样的业务,可以用InnoDB
- 在内存中临时建表,要求速度快、数量小,不需要持久化,可以使用Memeory
- 当数据都是归档的,可以使用Achieve,toku,推荐用toku,它的压缩效率非常高
🎉char、varchar的选择?
定长选择char、变长选择varchar
🎉text/blob/clob)的使用问题?
不推荐使用,一使用性能会下降几倍甚至一个数量级。因为它们一方面数据量大,另一方面查询时需要查询2次数据库。
🎉文件、图片是否直接放入数据库?
不建立,如果要放,放文件路径或url
🎉是否使用外键、触发器?
一般不使用,因为使用外键会降低性能。
🎉唯一约束和索引的关系?
创建唯一约束时,会自动创建索引,所以我们不用再手动建立索引。
🎉是否可以冗余字段?
可以,有些时候使用冗余字段可以减少关联查询,直接在当前表查询,查询效率更高。
🎉是否使用游标、变量、视图、自定义函数、存储过程?
不推荐使用,因为使用后可移植性低,而且业务操作一般放在代码层面解决而不是数据库。
🎉自增主键的使用问题?
数据量不大的时候可以使用
🎉能够在线修改表结构(DDL操作)?
不推荐,因为DDL操作会锁表,影响用户使用。可以在晚上业务系统没什么压力的时候做。非常推荐在停机的时候做。
🎉逻辑删除还是物理删除?
一般情况下建议只做逻辑删除不做物理删除
🎉要不要加create_time,update_time时间戳?
推荐所有表都加上,一方面可以记录我们什么时间创建表,什么时间修改过表,另一方面有利于数据迁移。
🎉 数据库碎片问题?
类似JVM的垃圾压缩,这些操作会锁表,推荐停机的时候操作。
🎉如何快速导入导出、备份数据?
🔥导出方式
- 直接查出来,然后存起来,需要锁表。推荐停机的时候做
- 主从结构时,把从库的数据备份
- 做数据的binlog订阅
🔥导入方式
- insert批量导入
- Java代码导入
- 脚本导入
导入时一把会先把表的索引和约束全部去掉,然后再批量导入,最后再基于新的数据建立索引和约束。因为索引和约束本身是数据结构,每次插入数据都要进行维护,消耗性能。