ON b.id1=a.id1
AND b.id2=a.id2
WHERE b.txt=:d1
AND a.txt=:d2
楼主的查询中除了最后ORDER之外,似乎根本与 date 无关。 按照日期进行分区似乎没什么意义。
AND b.id2=a.id2
WHERE b.txt=:d1
AND a.txt=:d2
楼主的查询中除了最后ORDER之外,似乎根本与 date 无关。 按照日期进行分区似乎没什么意义。
斑竹大人,除了查询以外,date的作用是用作删除2个月前的记录mysql_query("DELETE FROM table WHERE date < ".strtotime('-2 months')); 22.6GB的表,(数错了,总共1.2亿条记录,一天大概200万条),删除的话,非常耗时耗资源,而且还会造成死机。显然表的体积太大,不合理。试过了,复制一个表,然后TRUNCATE,大概1秒多1点就搞定,所以想是不是应该分表?但是不知道分表后查询语句该怎么写?
分完后怎么查询呢?SELECT * FROM
table1 a JOIN table2 b JOIN table3 c JOIN table4 d ...如果按日分,2个月62个表要写62遍JOIN?分表后查询完全不懂。请教了。
SELECT * FROM
table1 a JOIN table2 b JOIN table3 c JOIN table4 d JOIN table5 e 手写60遍join?
我有类似的经验,希望能帮到你:
一天200W记录,一个月就6000W,按月分差不多了。
然后有跨月查询的业务的话,你就设计汇总表,看你业务需求了,你可以按月汇总,按天汇总,这样可以解决跨表查询的问题。
如果有跨表查询明细的话最蛋疼了。我看你到的表结构是没有主键的,业务允许的话,这样可以分区,分表+分区结合起来,很快的。具体怎么操作就要看业务需求了。
大大,怎么完成这样的数据表及查询?还是不懂,有没有实例或教程?
比如给些代码CREATE TABLE `tablename`(
`id` int(9) NOT NULL AUTO_INCREMENT,
...
);
select * from `tablename`就是不知道这样的表,SQL语句到底是什么样子的?是innodb还是myisam或者别的? 谢谢。
数错了,总共1.2亿条记录,一天大概200万条。
存储当然没问题,就如我说的,22.6GB数据,查询平均只需0.4秒,但是由于我的表需要频繁的更新(INSERT,SELECT,DELETE),现在我头痛的是DELETE那一块。硬盘不允许每天新增200万条记录而不删除。而且业务也不需要保存2个月以上的记录。怎么删的快?分别只是我想到的一点,因为 TRUNCATE table 小于1秒,但
DELETE FROM table WHERE date < ".strtotime('-2 months') 根本就跑不动(一句语句删除200万条记录,即使date加了index)
1.如果不需要跨天查询的话,考虑每天一张表。默认drop62天前的表,估计需要调整相应的业务逻辑。
2.每月一张表,200w*31=6200w,drop一张大表,如果是innodb的表,需要考虑全局独占锁。
3.同样啊,一天一个分区?一个月一个分区?叶金荣,吴炳锡两位大牛好像不怎么建议用MySQL的分区表,具体的欢迎各位拍砖。
4.分库?这个思路没有怎么想清楚啊,楼主可以试着想想看。
1,数据分表,1天一张,或者做分布式存储,比如PostgreSql,把数据按一定规则分布多台数据库中
2,删除掉所有索引,更新索引对于大数据表很恐怖
3,写入数据时,使用缓存池,比如优先装入:redis集群,缓存池后,每100条写一次,减少频繁访问IO
3,把数据装载到中间件,增量索引
4,查询数据的时候中间件,比如hadoop + lucene +solr 可以参考这个:http://download.csdn.net/detail/longkeyy/6975015给个参考,我之前一个项目,数据量4亿多行,字段10几个,占硬盘800G,写入没死过,翻页查询1秒左右