现在做了一个新闻系统。可是数据库设计不太合理,所以现在每天都会出现死机的情况,想请教高手如何调优。
情况是这样的:
有一个新闻系统表,
新闻(ID,标题,新闻内容,发布人,发布时间,访问次数,最后访问时间)
因为一条新闻可能发布到多个频道中,所以有一个新闻映射表
新闻映射(ID,新闻ID,标题,发布人,发布时间)
这两个表的数据,
新闻表有30多万,映射表有60多万
每看一条新闻的时候,都需要设置新闻的访问次数,即需要
update 新闻 set visit_times = visit_times + 1, visit_date = now() where 新闻ID=ID
如果第一次访问该新闻,需要读取新闻的信息
select 标题,内容,发布人,发布时间 from 新闻表,映射表 where 新闻ID=ID AND 新闻映射中新闻ID=新闻表ID
后来发现,如果访问量太大,则会出现update 新闻表时出现锁定。我想可能是因为有正在读新闻表的时候,却又在UPDATE,造成了死锁。
因此我想增加两个表,新闻内容表,保存新闻内容,新闻相关表(新闻ID,保存访问次数,访问时间)
这样,UPDATE只是写新闻相关表,而不需要写新闻表。应该就不会造成死锁。
但是,这样的话,查询就会有三个表联查
select * from 新闻表,新闻映射表,新闻相关表(主要查访问次数)where 新闻映射中新闻ID=新闻表ID AND
新闻相关表ID=新闻ID
这三个表都有索引,几十万条数据查也很快,但是这样联合查,索引还起作用吗(好象建立外健应该还有用)?
速度能跟的上吗?
这样update的时候,还会锁定吗
情况是这样的:
有一个新闻系统表,
新闻(ID,标题,新闻内容,发布人,发布时间,访问次数,最后访问时间)
因为一条新闻可能发布到多个频道中,所以有一个新闻映射表
新闻映射(ID,新闻ID,标题,发布人,发布时间)
这两个表的数据,
新闻表有30多万,映射表有60多万
每看一条新闻的时候,都需要设置新闻的访问次数,即需要
update 新闻 set visit_times = visit_times + 1, visit_date = now() where 新闻ID=ID
如果第一次访问该新闻,需要读取新闻的信息
select 标题,内容,发布人,发布时间 from 新闻表,映射表 where 新闻ID=ID AND 新闻映射中新闻ID=新闻表ID
后来发现,如果访问量太大,则会出现update 新闻表时出现锁定。我想可能是因为有正在读新闻表的时候,却又在UPDATE,造成了死锁。
因此我想增加两个表,新闻内容表,保存新闻内容,新闻相关表(新闻ID,保存访问次数,访问时间)
这样,UPDATE只是写新闻相关表,而不需要写新闻表。应该就不会造成死锁。
但是,这样的话,查询就会有三个表联查
select * from 新闻表,新闻映射表,新闻相关表(主要查访问次数)where 新闻映射中新闻ID=新闻表ID AND
新闻相关表ID=新闻ID
这三个表都有索引,几十万条数据查也很快,但是这样联合查,索引还起作用吗(好象建立外健应该还有用)?
速度能跟的上吗?
这样update的时候,还会锁定吗
如果第一次访问该新闻,需要读取新闻的信息
select 标题,内容,发布人,发布时间 from 新闻表,映射表 where 新闻ID=ID AND 新闻映射中新闻ID=新闻表ID
第一个UPDATE 语句里面
给ID 加上索引。
第二个SELECT 语句改成LEFT JOIN。
然后加上相应的索引。
至于如何加相应的索引。用EXPLAIN 一下就知道了。
新闻相关表ID=新闻ID 三个表如何查询呢,
新闻表 a
新闻影射表 b
新闻相关表 c
select * from a left join (b,c) on (a.id = b.id and a.id = c.id);
select * from a, b where a.id=b.f_id(f_id保存的是a中的ID值)
和使用
select * from a left join b on a.id=b.f_id
两个查询的纪录数不一样,后者要多一些
而且后者的时间也要多一些
第二个是左连接,以A表为准,不管是否与B表中的KE字段(ID)
匹配都显示出来,A表记录>B表记录数。
后者是 left join .
肯定后面的多。
这样就一样了
select * from a left join b on a.id=b.f_id where b.f_id is not null
A有,B也有 即INNER JOIN