HI all:
本周主要的任务
1 跟进商圈定向的测试
2 新官网数据统计新增 FSiteType 和 FHotTag字段, 跟进db 的 ddl 变更
3 米大师白名单, 转化跟踪(付费,加入购物车,付款)去掉白名单限制 , 拆分激活率为 下载激活率和点击激活率
总结:
在做官网数据的统计这个需求的过程中, 涉及到更新表的字段, 期间多次更改代码的 cr, 第二次体会到公司对 在 db 上的严谨性. db元数据不一致问题拖延了项目的进度, 期间也多次和 mof_helper 争论了 关于 not null 的合理性, not null 对 db 的索引效率的提高我不否认, mysql 是使用 b+ tree 作为索引, 而 b+ tree要对 null 做特殊处理影响效率.
疑问:
那为什么非索引的字段也要强制 null 呢, 起初我想当然的以为 mysql 的innoDB 引擎默认会对所有的字段做索引的(其实想想就知道不可能)
mysql innoDB 使用的 B+ tree, InnoDB的数据文件本身就是索引文件,这种索引类型叫做聚集索引。主要的原理下面的文章写的非常不错,我也简要的概述一下:
1 表数据文件本身就是按B+Tree组织的一个索引结构:如下图
叶节点包含了完整的数据记录。
2 InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。这里也解释了为什么不建议使用过长的字段作为主键
上面的两点也就排除了我 前面的疑问
解答
这是 mysql 官方的一段话:
NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte
null 值和空值是不一样的, null 值会占用额外的1bit 空间
1 很多表都包含可为NULL的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性(TIMESTAMP除外),然而通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。
2 如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引统计和值比较更加复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊的处理。当可为NULL的字段被索引时,每个索引记录需要一个额外的字节,在MyASIM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
3 通常把可为NULL的列改为NOT NULL 带来的性能提升比较小,所以(调忧时)没有必要首先在现有schema中查找并修改这种情况,除非确定这会导致问题。但是,如果计划在列上建索引,就应该尽量避免设计为NULL的列。当然也有一些例外,例如值得一提的是,InnoDB使用单独的位(Bit)存储NULL值,所以对于稀疏数据(很多值为NULL,只有少数行是非NULL)有很好的空间效率。但这一点不适用于MyISAM。
---引用自《高性能MySQL》
书上的话基本解答了我的疑问, 同时 ,也证明了光看书还是不行的,在校看过很多的书, 但是 看完之后能记住的不多, 主要还是缺乏真实的项目经验, 所以以后还是要在遇到问题的时候多思考多去探究,同时要反过来多去看看以前看过的那些书, 会有更深刻的理解
这篇文章在解释关于 db 的索引上面还是讲的深入简出,http://blog.jobbole.com/24006/
版本管理:
在接触投放端的一个月中, 对我最大的挑战不是代码, 而是版本管理的流程, 起初内心还是有点小抗拒的, 心想为什么要把版本的管理搞得这么复杂, 而事实上它确实是挺复杂的
期初我觉得问题是在版本管理软件上面, 如果换了 git 会有很大的改善么? 答案应该是不会, svn 和 git 都是代码管理的软件, 在公司的开发项目中, 就算是使用 git 我们多半也会把 git 当做 svn 来用, 而 git 本身最有特色的分布式的特性 可能在本地切分支的时候用的比较多. git 也许仅仅适用于代码本身的管理吧, 至于在公司的项目中, svn 目前反而更合适高效
接触的时间越久, 认识到复杂是由于软件系统本身复杂, ssi 使用 include 来拼接不同版本的模块确实是一种非常好的管理方法, 一方面前期是因为自己本身对项目整体了解的不够深入, 其次是v1
v2两个版本的杂糅也增加了一些难度. 相信后面随着项目经验的累计, 对系统会有一个更加全面的掌握
监听 css 动画 transitionend事件,animationend事件:
在做商圈定向批量上传的时候, 有个地方会有两个弹框, 弹框消失是自带 css3动画的, 为了防止 上一个动画未完全消失就出现下一个弹框, 我使用 setTimeout来延迟下一个弹框出现的时间. 这里我被自己局限住了, 想当然的以为 css的渲染和 js 的不是同一个线程,和以往的使用 js 实现的动画是不一样, 就认为无法实现 css动画结束的监听, 后来网上搜一下才知道transitionend事件,animationend事件, 这里感谢 Walker 指出我的问题, 容易被自己的认知局限住. 以后遇到类似的问题还是要多去网上搜索一下, 不能想当然的觉得…