0

我在让 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

我有以下索引:

  • 日期
  • 时间
  • 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(date, time),结果还是一样。

4

2 回答 2

1

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

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

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

于 2012-05-21T07:51:43.473 回答
0

你需要有这样的索引:

  1. (p.mid, p.uid)- 复合一
  2. (po.mid, po.uid)- 另一种复合物
  3. (m.date, m.time)- 另一种复合物

PS:这个查询从每个表中选择了多少(百分比)行?如果值很大(超过 30%)——那么 mysql 不会故意使用索引

于 2012-05-09T23:17:03.143 回答