在JOINed查询中的MySQL FORCE INDEX位置

时间:2012-05-09 23:08:06

标签: mysql mysql-error-1064

我在让MySQL在正确的字段上放置INDEX()时遇到了一些麻烦。我有一个查询,例如,这样的东西:

SELECT m.id as mid,p.id as pid,po.* FROM m 
LEFT OUTER JOIN p ON p.mid = m.id AND p.uid = 2 
LEFT OUTER JOIN po ON po.mid = m.id AND po.uid = 2 
ORDER BY m.date,m.time

我有以下索引:

  • m.date
  • m.time
  • p.mid
  • p.uid
  • po.mid
  • po.uid

但是,当我运行EXPLAIN查询时,没有任何键被选中。我尝试将FORCE INDEX语句放入,但MySQL一直拒绝它们(说查询中存在语法错误)。有什么想法吗?

修改

这是EXPLAIN

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  m   ALL NULL    NULL    NULL    NULL    31  Using filesort
1   SIMPLE  p   ref mid,uid mid 5   db.m.id 1   
1   SIMPLE  po  ref uid,mid uid 5   const   1   

请注意p和po现在处理得很好,但m仍然没有。我刚为m添加了一个INDEX(日期,时间),但仍然保持不变。

2 个答案:

答案 0 :(得分:1)

FORCE INDEX通常在表名后使用,即

... FROM <table_name> FORCE INDEX (<index_name>)

但我不建议使用它。如果您希望使用索引进行排序,则可以在(m。date,m。time)上创建复合索引IDX_date_time。

答案 1 :(得分:0)

你需要有这样的索引:

  1. (p.mid, p.uid) - 复合一
  2. (po.mid, po.uid) - 另一个复合词
  3. (m.date, m.time) - 另一个复合词
  4. PS:使用此查询选择每个表的行数(以百分比表示)?如果值很大(超过30%) - 则mysql不会故意使用索引