2014-06-19 88 views
0
SELECT * 
FROM restaurant_rate 
WHERE 
    table_id IN (SELECT id_table FROM rTable WHERE restaurant_id = ?) 
LIMIT 0, 10; 

内部选择的结果数量不是静态的。在这种情况下,mysql只扫描10行一个一个地搜索?或扫描整个表并返回前10行? id_table是rTable的索引列。mysql限制条款

+2

您可能需要'restaurant_id'的索引以及'id_table' –

回答

0

您的查询写入的方式相当不便,因为它会强制您的表中的每行评估in子句。如果rTable中有很多记录符合条件(比如说1000),那么restaurant_rate中的每一行都需要与1000个值进行比较,然后才能被where条件接受或拒绝。

我会重写查询是这样的:

select rr.* 
from 
    restaurant_rate as rr 
    inner join rTAble as r on rr.table_id = r.id_table 
where 
    r.restaurant_id = ? 
limit 0, 10; 

事情你必须考虑:

  • 需要索引参与join并在where条件的列。
  • 使用limit没有order by没有多大意义;在limit之前添加order by子句。
+0

谢谢Barranka。你的答案是“它强制评估表中每一行的in子句”正是我想知道的。谢谢。 – user2660234