我在让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
我有以下索引:
但是,当我运行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(日期,时间),但仍然保持不变。
答案 0 :(得分:1)
FORCE INDEX通常在表名后使用,即
... FROM <table_name> FORCE INDEX (<index_name>)
但我不建议使用它。如果您希望使用索引进行排序,则可以在(m。date
,m。time
)上创建复合索引IDX_date_time。
答案 1 :(得分:0)
你需要有这样的索引:
(p.mid, p.uid)
- 复合一(po.mid, po.uid)
- 另一个复合词(m.date, m.time)
- 另一个复合词PS:使用此查询选择每个表的行数(以百分比表示)?如果值很大(超过30%) - 则mysql不会故意使用索引