`

数据库使用经验谈之3点:架构,NULL值,索引与查询

阅读更多
小型项目对于数据库的使用往往比较随意,过多的考虑分库分表等策略对于相当多数没有海量数据需要存储到db的应用又显得浪费。那么如何避免,特别是当数据库压力比较小的开发初期,db架构方面的问题,我想遵循几个简单的原则就可以。从应用架构的角度,项目中最常见的问题有三种:如何使用数据库,NULL值,索引与查询。

一,如何使用数据库
1,围绕数据库的使用方式也决定架构如何。正如“MySQL数据库开发的三十六条军规”开篇所说:

•别让脚趾头想事情
•那是脑瓜子的职责
•让数据库多做她擅长的事:
尽量不在数据库做运算
复杂运算秱到程序端CPU
尽可能简单应用MySQL

这么简单的道理,却曾在项目里被argue很多次。理由是数据库中进行逻辑处理,任何过程通过query db便可见,利于debug和测试。事实证明这是一种错误的思路,虽然得了小利却在系统扩展性和性能上吃了大亏,是失败的构架。
2,设计表结构时多用数值列,比如ip就可用整数而不是字符列表示;


二,查询
一般不推荐使用复杂的查询,且如果你的架构合理,应该是少查少写。

1,可以的话,不要使用select *样式的SQL。原因是DBMS会将“*”依次转换成所有的列名,需要查询数据字典,耗费资源;
2,充分利用主键列或者索引列,这里引用一个数据加以说明:
MySQL> select sql_no_cache * from post limit 80000,10;
10 rows in set (0.58 sec)
MySQL> select sql_no_cache id from post limit 80000,10;
10 rows in set (0.02 sec)
3,对于mysql,少用子查询,而多用join;比如减少使用:
select * from table1 where id in (select id from table2);

三,索引与null值

1,索引不是越多越好,建立索引应充分考虑其需求。
2,如有null的列,最好不建立索引,因null值不放入索引,使得全表扫描的几率变大。至于是否加入默认值替代null,则要估计应用数据中null值有多少。这里有篇博文http://space.itpub.net/17203031/viewspace-692784写得非常详细,推荐大家去看)
3,另有一种说法是mysql只使用多个索引中的一个,这是不对的。mysql是否使用多个索引主要是根据查询的方式决定。推荐这篇文章,比较详细:http://hi.baidu.com/wangxinhui419/blog/item/f22ee343cfd9f90672f05d06.html


另附上“MySQL数据库开发的三十六条军规”以方便大家参考mysql中的其他有趣规则。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics