问题
我应该采用哪些优化来使这个数据库易于管理?我读过很多关于优化大数据库的文章,但我是新手,所以很难确定哪些技术适合我的设置。
数据库信息
我将大约 9000 万行从平面文件 csvs 加载到 mysql 数据库(aws RDS,如果重要的话)。有 60 列,每行代表对网站的一次点击。
数据类型:由于 mysqlimport 实用程序的限制,所有数据类型都是文本(具体来说,它对数字字段中的空值与 0 值的处理,我可能是错的)
每列属于以下类别之一:
访问信息:时间、引荐来源网址等。许多页面记录数百万次访问(例如首页),有些只记录少数。
用户信息:城市/州等。用户登录的访问次数从 1 次到数千次不等,分布偏斜。
页面信息:url、内容标志等。
IO - 数据库只有 4 个用户,因此不会有很多 i/o,主要是在我们的 python 数据分析环境中填充数据帧的查询。
indexes - 除了默认生成的索引外没有。索引的候选对象是用户 ID 和页面浏览时间戳(可能是多列索引?)
选项
我欢迎任何其他想法,但这是我通过一些搜索得出的想法。有兴趣了解哪些步骤值得,哪些不值得。
调整每个字段的数据类型的大小——这会提高性能吗?大多数字段是文本或布尔标志。
将表格分成至少 2 个,例如,访问信息和页面信息。
放在一张表里,分区。根据我的阅读,我认为在最常查询的字段上进行分区是最佳选择。
OPTIMIZE TABLE
几乎总是不值得做的。INDEXes
是您的朋友——他们可以(在许多情况下)使查询运行速度提高几个数量级。提供一个慢查询,加上SHOW CREATE TABLE
,我们可以帮助您。或者研究我的食谱。如上所述,选择“正确的”索引(可能是复合索引)要求您首先对SELECTs
您将要执行的操作有一些线索。“Rightsizing”数据类型是个好主意,尤其是在首次创建表时。更小 --> 更可缓存 --> 更少的 I/O --> 更快。
两个表(访问信息和页面信息)?如果是 1:1,通常 1 桌是“对的”;如果他们是 1:many,那么必须有两个表。