1
mifan OP 补充一个有这种问题的url
http://tianya.lu/posts/pages/123406 也许会很快, 那是因为有缓存缓存这个页面的时间是10 min, 但是10分钟过期后,,, 用户体验为零. 点了就没反应, 半分钟之后才能动...... |
2
mifan OP 上面的url 给错了, 应该是这样的url:
http://tianya.lu/topics/10000/pages/23492 才会更慢.... |
3
mifan OP create_table "posts", :force => true do |t|
t.integer "topic_id", :null => false t.integer "author_id", :null => false t.integer "page_id", :null => false t.datetime "posted_at", :null => false t.datetime "updated_at" t.integer "post_favorites_count", :limit => 2, :default => 0, :null => false t.boolean "valuable", :default => false, :null => false t.integer "post_content_id" end add_index "posts", ["author_id"], :name => "index_posts_on_author_id" add_index "posts", ["post_favorites_count"], :name => "index_posts_on_post_favorites_count" add_index "posts", ["posted_at"], :name => "index_posts_on_posted_at" add_index "posts", ["topic_id", "author_id"], :name => "index_posts_on_topic_id_and_author_id" add_index "posts", ["topic_id"], :name => "index_posts_on_topic_id" add_index "posts", ["updated_at"], :name => "index_posts_on_updated_at" add_index "posts", ["valuable"], :name => "index_posts_on_valuable" posts 表 的结构 |
4
Platinum 2011-02-17 13:19:20 +08:00
建一个 topic_id,id 的复合索引
主要是你的 OFFSET 太大了,可以考虑 cursor 式分页 http://timyang.net/web/pagination/ 你这种是标准的 SQL 操作,不是 key-value 性质的,跟 mongodb 没关系,先不用惦记 |
5
leolmncn 2011-02-17 13:27:08 +08:00
简单的方法是采用mysql 5.1以上版本支持的partitioning。可以根据日期或ID范围进行物理分表。但是逻辑表对于rails还是一个。插入时更新索引的速度和个别记录的查询性能都会提升。
mysql 官方文档: http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitioning_with_dates.html |
6
mifan OP |
7
napoleonu 2011-02-17 14:10:16 +08:00
妈妈说select语句不让写*
一天100W,换机器吧。 |
9
Livid MOD 你计算过 posts 表每一行的平均长度么?
如果其中有一个字段是 post 的内容,那么建议把这个长字段删掉,然后把 post 的内容放到一个 key-value 数据库中。 这样的话,整个 posts 表的尺寸会降低一个数量级。 |
10
Los 2011-02-17 16:25:09 +08:00
VPS的32G硬盘很快会满吧?
|
11
mifan OP @Livid 有一个 post_contents 表 ,
posts 表 有 "post_content_id" 作为关联 , 呵呵 , 只在这个表上有 select * from post_contents where id = xxx 的操作, 这个到成为不了瓶颈. 我的上一次优化就是 把 posts 表 拆成了 posts 和 post_contents 2个表 , 不然 50 W 条数据 就已经跑不动了 :) |
12
mifan OP Update ...
根据@Platinum的建议,加了3个index... , 现在 最长的查询大概3s, 性能10x..., 想办法用cursor中... def self.up change_table :posts do |t| add_index "posts", ["id", "topic_id"] add_index "posts", ["id", "author_id"] add_index "posts", ["id", "topic_id", "author_id"] end end |
14
Platinum 2011-02-17 18:23:16 +08:00
http://hi.baidu.com/thinkinginlamp/blog/item/a352918fe70d96fd503d925e.html
这属于进阶问题了,文章最下面的那个 INNER JOIN 可谓大杀器,有些场合很明显,可以继续试试 还有就是 @Livid 的拆字段问题,我认为对于 Covering Index 的查询,表的大小无所谓……因为这时候主要是看索引文件的大小 |
15
Platinum 2011-02-17 18:27:45 +08:00
另外,复合索引的顺序很重要,我怎么看你那几个索引都是 id 在最前……
|
16
Platinum 2011-02-17 18:30:28 +08:00
说乱了,那个不是 Covering Index ……应该说是不需要扫描全表(只匹配索引就够了)的查询
|
17
Livid MOD SELECT * 类型的查询的性能,和表尺寸是有关系的,会影响查询完成后读取时的 IO 数量。
|
18
manhere 2011-02-17 19:38:38 +08:00
不想分表 可以分库呀
|
19
napoleonu 2011-02-17 21:09:15 +08:00
数据量不小,1G内存,还要跑APP,怎么折腾就那样,用户稍微多那么几个就直接当机吧。
|