想请教一下大家,如果我建了索引,发现实际情况并没有用到,如果能明确指定一个索引呢?
另外我用explain去分析查询语句,怎么根据这个结果去调整呢?

解决方案 »

  1.   

    要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX
      

  2.   

    一般来说,MySQL应该按规则找到最佳的执行方案,不需要你去调整。
    如果有问题可以先analyze table来重新生成一下统计分析结果。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。参见13.2.7节,“SELECT语法”。尝试下面的技巧以避免优化器错选了表扫描:·         使用ANALYZE TABLE tbl_name为扫描的表更新关键字分布。参见13.5.2.1节,“ANALYZE TABLE语法”。
    ·         对扫描的表使用FORCE INDEX告知MySQL,相对于使用给定的索引表扫描将非常耗时。参见13.2.7节,“SELECT语法”。
    ·                SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
    ·                    WHERE t1.col_name=t2.col_name;
    http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#how-to-avoid-table-scan
    7.2.15. 如何避免表扫描
      

  3.   

     SELECT * FROM TABLE1 USE INDEX (FIELD1, FIELD2) …
    or
    SELECT * FROM TABLE1 FORCE INDEX (FIELD1) 
      

  4.   

    还能问下您,如果根据EXPLAIN的结果去优化呢,比如TYPE类型为ALL
    ,它的效率肯定不好,什么时候用什么索引速度能更快呢?怎么判断一个表的索引建立的合不合适呢
      

  5.   

    对扫描的表使用FORCE INDEX告知MySQL,相对于使用给定的索引表扫描将非常耗时
    ---这句话的意思是不是使用强制索引要比不使用时熬时更多啊?
      

  6.   

    根据你的SQL语句来判断,一般来讲,在连接字段上建立索引,你的问题太大,
    举个具体例子吧
      

  7.   

    什么时候用什么索引速度能更快呢?怎么判断一个表的索引建立的合不合适呢表比较大的时候,索引上的势也比较大(值比较分散,比如你1000000记录,按男女建索引显示效率没什么大影响)。 根据你的查询可以判断你的索引是否合适,看explian的结果了。
      

  8.   

    ---这句话的意思是不是使用强制索引要比不使用时熬时更多啊? 这个中文的理解是这样。(MySQL的中文帮助翻译得很差,建议中英文一起看)
    Use FORCE INDEX for the scanned table to tell MySQL that table scans are very expensive compared to using the given index: 用FORCE INDEX 告诉MySQL全表描扫比我给你的索引更耗资源。(我翻得也不怎么样。)