我的数据库分了2个表,一个表储存常规数据,一个表储存 fulltext index 数据
每天将插入10W条左右的数据,数据库现在大小已经几十 GB了,还在继续增大。
同样的query语句,现在的查询速度和只有2,3G数据时的速度相比,要慢许多,(原来只要0.0几秒,现在要2秒左右)。查看 phpMyAdmin->数据库->结构->详细->索引 展开(结构最底下的那个‘详细’扩展)已用空间
类型 已用
数据 ...
索引 ...
多余 87,128.5 kb
总计 ...有一个‘多余’,难道是这个类似磁盘碎片东西影响了查询速度?服务器有mysql链接时间限制,直接用 OPTIMIZE TABLE `tablename`, 运行没多少时间久会超时。请问,如何优化几十GB以上的大表?另外,数据表类型是 MyISAM ,我那个储存 fulltext index的表有3个自动,都设置为 varchar(255),请问,如果设置成text 不限长度的形式,对查询速度有影响吗?谢谢。

解决方案 »

  1.   

    现在分区,是不是要停止 一切 insert 和 update 活动?
      

  2.   

    请问你机器配置现在如何  内存和cpu
      

  3.   

    内存7。5GB,Intel Xeon 5420 2.5G。再问一下,我的情况如何分区较好?按时间分?一周或一个月分一次?需要用cron程序定时自动运行分区?分区之后,新的insert和update都会自动遵循时间分区情况,自动归档?
      

  4.   

    看数据量。 分区的本质是把一个大文件分解成多个小文件。 而查询一般是在某个或某几个小文件中进行。这样提高IO速度。 
    不需要,数据插入或更新的时候MYSQL会自动对应。
    自动。
      

  5.   


    那么,就是建表的时候一次完成?CREATE TABLE info_index ( //info_index只储存索引项
        id int unsigned NOT NULL auto_increment, //id是2个表对照的编号
        title VARCHAR(255) NOT NULL,
        descrip text NOT NULL,
        date VARCHAR(10) NOT NULL,
        joined DATE NOT NULL,
        PRIMARY KEY  (`id`),
        FULLTEXT KEY `index` (`title`,`descrip`,`date`)
    )
    PARTITION BY RANGE( month(joined) ) (
        PARTITION p0 VALUES LESS THAN (201101),
        PARTITION p1 VALUES LESS THAN (201102),
        PARTITION p2 VALUES LESS THAN (201103),
        PARTITION p3 VALUES LESS THAN (201104),
        ...
    );(201101)(201102)(201103)这里的月份应该转换算成UNIX时间戳,进行储存。如果我每一个月分一个区(1个月大概300W条信息),从2011年1月开始,5年计划,是不是分区时,上面的代码要一直写到  PARTITION p60 LESS THAN (201412)?然后给用户引索时,搜索原则是最今天之前的6个月内数据,sql 语句就是用 join 限制最近6个月的6个分区就可以了?