摘要: 目标:恢复或重置密码反模式:使用明文存储密码 1、存储密码 如果攻击者截取到你用来插入密码的sql语句,就可以获得密码 2、验证密码 与上面相同。 3、在email中发送密码 email可能会被黑客劫持、记录。解决方案: 先加密再存储 重置密码而不是恢复密码 阅读全文
posted @ 2012-05-08 10:54 日暮乡关何处是 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 目标:检查sql查询次数反模式:试图用一条sql解决复杂问题 结果是:性能很低,而且往往得到了一个笛卡尔积。解决方案:分而治之 用多个sql得到数据,再进行整合。或者union多个sql的结果。 阅读全文
posted @ 2012-05-08 10:38 日暮乡关何处是 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 目标:减少输入反模式:使用* 缺点1、传输的数据量大。解决方案:明确列出列名 这一章内容太简单了,好像没啥可说的。我想起用ibatis的时候遇到的一个问题:最初的sql都是自动生成的,比如根据id update某个表,输入参数是这个表对应的一个entity,包含了这个表几乎所有的字段。这样使用的时候往往是: 先new一个entity,id确定,然后只给其中几个字段赋值 调用这个update语句执行。这样没有赋值的字段就被对应的default(type)值覆盖了! 阅读全文
posted @ 2012-05-08 10:38 日暮乡关何处是 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 目标:模糊查询反模式: like 缺点:性能太差,无法使用索引,必须全表遍历。合理使用反模式: 数据量小、条件简单时可以用。解决方案: 使用特殊的搜索引擎而不是sql 1、数据库扩展,各大数据库都有对全文检索的解决方案,但是配置复杂。 2、使用第三方搜索引擎,比如lucene... 3、实现自己的搜索引擎: 使用反向索引,就是一个所有可能被搜索的单词列表。再将与单词批量的数据的id保存到一个交叉表里。 一旦有新的搜索单词,就使用like查询结果,并将结果保存到交叉表里,这样下次就不必like了。 一旦有新的文档入库,就需要用触发器(或者定时)去填充交叉表。 阅读全文
posted @ 2012-05-08 10:31 日暮乡关何处是 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 目标:随即排序反模式: 使用rand() 缺点是无法利用索引,而且是全表遍历,性能太差合理使用反模式: 数据量很小的时候可以用解决方案: 1、使用随机数 ceil(rand()*(select max(id) from T) as randId) 问题是,取出的id有可能是不存在的,因为id不是连续的 2、选择下一个最大值 为了避免id不存在,我们找上面那条id的后一条数据。方法是:用上面那条sql和主表再关联一次,然后找关联后的第一条 3、使用row_number这一章也很搞啊,作者咋想的?使用rand()根本无法随机排序。 select *,RAND()as... 阅读全文
posted @ 2012-05-08 09:45 日暮乡关何处是 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 目标:要查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段反模式:引用非分组列 如:select articleid,max(tagid),tagname from articleTag group by articleid这一章有点搞,因为这一章的目标用group去实现,根本就是个错误(mssql是这样),语法就不对!mssql里用row_number就行了,如果不用group就很麻烦了,比如有一个people表,里面有firstname、lastname、age几个字段,现在想得到每个firstname分组里年龄最大的人的lastname用row_num... 阅读全文
posted @ 2012-05-08 09:11 日暮乡关何处是 阅读(945) 评论(0) 推荐(0) 编辑