用select id,a,b,c,d,e from table where hits>100 and menuid=1 order by id desc limit 200的时候第一次运行速度特别慢,这个表有60多万条数据其中hits、menuid建立了索引,有什么办法让它速度快起来吗??show processlist 的时候,有很多Sending data,都是中间有hits>100 and menuid=xx的
menuid是目录的ID值,只有1、2、3、4、5、6、7、8、9、10、13、17、19这几种记录hits是记录点击数,但正常运行时并不update数据,只有压力少的时候update

解决方案 »

  1.   

    建立 menuid、hits 聚集索引好了
      

  2.   

    注意顺序哦 
    假如你建立的是 hit、menuid聚集索引 和没有索引一样了
      

  3.   

    60万条数据就慢了?
    我们这里很多表都100万+的数据量了。速度也是有些慢,不过还可以忍受。
    首先服务器最好要有1G或以上的内存。首先 id 是不是主键?如果不是,也建立索引。
    limit 200 是指从第200条数据开始取,一直取完。其次,以楼主的程序,建立  menuid、hits 聚集索引 会好一些,不过,没有最终解决问题。
      

  4.   

    不过,如果表结构和实际的SQL完全如上所示。
    速度应该不会太慢。
    如果很慢也是因为查出来的数据量特别大。
      

  5.   

    limit 200 是指从第200条数据开始取,一直取完-------------------------------------------真的?
      

  6.   

    回复人:wasuka(曲奇的吹火棍) ( 一级(初级)) 信誉:100  2007-05-14 10:32:00  得分:0

    limit 200 是指从第200条数据开始取,一直取完-------------------------------------------真的?=============
    错了,相当于 limit 0,20
      

  7.   

    我用的是MYSQL,查了一下,MYSQL好象没有聚集索引。
    第一次运行速度慢,当放到缓存后它才变快,但有时候紧急更新的时候,清空了缓存,整一台服务器就超慢,show processlist的时候里面就很多menuid=x的和hits>xx and menuid=x的SQL语句,表的结构:
    CREATE TABLE `t1` (
      `id` int(11) NOT NULL auto_increment,
      a varchar(250) default NULL,
      p varchar(250) default NULL,
      l int(11) default '0',
      q varchar(100) default NULL,
      j int(11) default NULL,
      r varchar(250) default NULL,
      `hits` bigint(20) default '0',
      s mediumtext,
      t int(11) default '0',
      i int(3) default '0',
      u int(11) default '0',
      m datetime default '0000-00-00 00:00:00',
      n int(11) default '0',
      v bigint(20) default '0',
      k int(11) default '0',
      w varchar(250) default NULL,
      x varchar(250) default NULL,
      y varchar(250) default NULL,
      z varchar(5) default '0',
      a int(10) default '0',
      b varchar(250) default NULL,
      c varchar(250) default NULL,
      d int(3) default '0',
      e varchar(250) default NULL,
      f varchar(20) default NULL,
      `menuid` int(3) default '0',
      g varchar(250) default NULL,
      h varchar(250) default NULL,
      bb varchar(3) default NULL,
      PRIMARY KEY  (`id`),
      KEY i (i),
      KEY j (j),
      KEY k (k),
      KEY l (l),
      KEY n (n),
      KEY m (m),
      KEY `hits` (`hits`),
      KEY `menuid` (`menuid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk
      

  8.   

    我仔细观察了好久,发现只要有menuid=x的SQL语句,它的第一次查询速度就比较慢,建立这个字段的索引和没有建立效率差不多,由于它只有几种记录,似乎建立索引效果欠佳,有什么好办法优化吗??
      

  9.   

    由于它只有几种记录,似乎建立索引效果欠佳
    ----------------------------------------
    如果值不多,建议你explain一下,看看MySQL的优化方式
      

  10.   

    +----+-------------+----------------+-------+---------------+------+---------+--
    ----+------+-------------+
    | id | select_type | table          | type  | possible_keys | key  | key_len | r
    ef  | rows | Extra       |
    +----+-------------+----------------+-------+---------------+------+---------+--
    ----+------+-------------+
    |  1 | SIMPLE      | t1             | range | hits,menuid   | hits | 9       | N
    ULL | 8108 | Using where |
    +----+-------------+----------------+-------+---------------+------+---------+--
    ----+------+-------------+
    1 row in set (0.03 sec)
      

  11.   

    那根据menuid做分区表吧  hits, menuid 分别做索引
      

  12.   

    limit 200 是取前面200个数据啊,你要查询所有的干嘛要用limit 200 这个语句啊