索引的力量
一直对数据库的优化一窍不通,大家谈论最多应该是怎样从 SQL 查询语句和索引下手去优化。对于索引,很多高手都写过很多文章,看来看去也没悟出什么东西,不过,今天我修改了数据表的几个主键(可以认为就是聚焦索引)并且添加了一些非聚焦索引,SQLServer 的性能立刻提高了上去。
对于 Users 表,原先是把主键设置为 UserID(自增字段)字段上,通过事件跟踪器,发现对于 Users 表的查询比较耗费资源(可以从 CPU、Reads、Duration这三相值来判断),而且所有的查询基本上都是对 Users 表的 name 来查询的,即 SELECT * FROM users WHERE name = 'xxx',既然WHERE后边跟的是 name,就应该把聚焦索引设置到 name 字段上,并且 name 字段是不重复的,所以可以这样修改。修改前的耗费忘了记录了,修改之后的耗费大大降低了,CPU、Reads、Duration分别为0、9、0。如果WHERE后面跟的字段是可重复的,就不能作为聚焦索引,这时可以为该字段添加非聚焦索引。
按照这个思路来优化其他表。
select count(*) from mark where name = 'xxx'
优化前
CPU / Reads / Duration(下同)
15 / 1401 / 16
32 / 1422 / 30
31/ 1422/ 46
优化后: 对mark表加入name以及infoid的非聚焦索引
0 / 38 / 0
15 / 39 / 16
0 / 12 / 0
0 / 81 / 0
0 / 37 / 30
0 / 12 / 0
select * from comment where infoid = '12345'
优化前:
0 / 644 / 0
15 / 664 / 16
优化后:comment表给infoid加非聚焦索引
0 / 158 / 0
0 / 158 / 0
16 / 42 / 16
0 / 42 / 0
对所有表都经过类似的优化后,性能立刻提升了上去,CPU 从原先的 95% 左右降低到 60% 左右。由此可见,对于表的设计应该非常重视主键的选择,不要为每个表都来一个 int 类型的自增字段作为主键,另外就是跟踪数据库查询,根据具体的查询来建立非聚焦索引。
不清楚 ASP.NET 到底能承受多大的页面浏览量,虽然这个问题问的太宽泛,但总体印象上,对 ASP.NET 的性能有所怀疑。大型 Web 好像也没有几个用 ASP.NET 做的,dangdang 网是的,圣诞节的时候去访问,老是出现页面打不开的故障;DoNews 也是,不过,也是经常出现那非常熟悉的错误页面,至于 MySpace,没有太多关注。
看到关于豆瓣的一组数据,很是羡慕:一台Web服务器运行 Lighttpd,每天处理2500万个request,峰值每秒处理1000个request; 一台应用服务器运行Python,每天处理500万PV; 数据库服务器运行MySQL,负载情况没有介绍。
对于特别注重速度的web2.0年代里,觉得 Python、PHP、ROR 这些轻量级的框架来做 Web 开发将更加适合,再加上免费的 Linux 平台以及 MySQL数据库,最理想不过了。微软也搞了一个 MVC 框架,呵呵,是不是觉察到了一些危机了呢?