"select id as sum  from manager where account ='kaka';id 是主键
1。查询条件where 中的 account的字段 不是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
2。查询条件where 中的 account的字段 是   该表索引的话,那么该查询的详细执行步骤是什么样子的?
 CREATE TABLE `session` (
  `id` varchar(20) NOT NULL default '',
  `appname` mediumtext,
  `username` mediumtext,
  `starttime` int(11) default NULL,
  `endtime` int(11) default NULL,
  `clientIP` mediumtext,
  `serverIP` mediumtext, 
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;3。此session表一天下来2000条记录。几年下来,数据量也很大,现在查询很慢。一般是基于查询条件是时间段的查询较多。一般一条session的Starttime与endtime之间的时间差在24小时之内,也有大于24小时的。我现在想在这个session表加索引,
怎么加好?大家提提建议

解决方案 »

  1.   

    1。查询条件where 中的 account的字段 不是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
    全表扫描,一条一条记录比过去。2。查询条件where 中的 account的字段 是   该表索引的话,那么该查询的详细执行步骤是什么样子的?
    MYSQL先去索引文件中找到这个索引项,然后再通过索引文件中的物理指针到数据文件中读出记录
      

  2.   

    3。此session表一天下来2000条记录。几年下来,数据量也很大,现在查询很慢。一般是基于查询条件是时间段的查询较多。一般一条session的Starttime与endtime之间的时间差在24小时之内,也有大于24小时的。我现在想在这个session表加索引,
    怎么加好?大家提提建议

    一天2000不算多吧。十年才不过2000*10*365 = 7,300,000具体怎么加索引,要看你的查询语句是什么了。
      

  3.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  4.   

    select id as sum  from manager where account ='kaka';
    id 是主键
    1。查询条件where 中的 account的字段 不是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
    全表扫描(一行一行的扫描,然后检索出account ='kaka'的id)
    2。查询条件where 中的 account的字段 是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
    扫描索引
    myisam类型的先读取索引,通过匹配的索引读取对应的行号,然后通过行号读取行取id
    innodb类型的直接读取索引,返回匹配的id(innodb聚集索引包括主键) 
      

  5.   

    按照时间给表分区吧,可以按照月进行分,具体的要先了解分区,然后才能建立合适的分区。具体的MySQL使用手册上讲的很清楚。
      

  6.   

    如果你没有具体的需求,仅凭你的目前说法,只能说创建一个基于`starttime` 的索引。
    问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
      

  7.   

    1。查询条件where 中的 account的字段 不是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
    ===>
    没有索引 只能进行表扫描,一条一条比下去2。查询条件where 中的 account的字段 是 该表索引的话,那么该查询的详细执行步骤是什么样子的?
    ===》
    有索引 如果'kaka'这个记录在总记录中分布密度小  那是可以用到索引的 但是如果密度很大 mysql会选择表扫描3。此session表一天下来2000条记录。几年下来,数据量也很大,现在查询很慢。一般是基于查询条件是时间段的查询较多。一般一条session的Starttime与endtime之间的时间差在24小时之内,也有大于24小时的。我现在想在这个session表加索引,
    怎么加好?大家提提建议
    ===》
    在 Starttime与endtime上 加索引。。
    索引一般加在联接字段上 或者 where的条件列上 如果数据量太大 可以考虑分区
      

  8.   


    select ....from session where MID(REPLACE(FROM_UNIXTIME(endtime),'-',''),1,8)<=20101231 and MID(REPLACE(FROM_UNIXTIME(starttime),'-',''),1,8)>= 20100101 例如这是一年的
      

  9.   

    select ....from session where MID(REPLACE(FROM_UNIXTIME(endtime),'-',''),1,8)<=20101231 and MID(REPLACE(FROM_UNIXTIME(starttime),'-',''),1,8)>= 20100101 这个查询什么索引也用不上,需要修改你的SQL语句select ....from session where endtime<UNIX_TIMESTAMP('2011-01-01') and starttime>=UNIX_TIMESTAMP('2010-01-01') and starttime<UNIX_TIMESTAMP('2011-01-01')
      

  10.   

    ACMAIN_CHM 是高手中的高手,用sql很多年了吧
      

  11.   

    说的没错,如果where子句用了函数的话,即使你给该字段创建了索引,查询优化器也不会去查询索引树的。
    所以建了等于没见