带有in子句的mysql限制

时间:2014-06-19 10:01:41

标签: mysql limit where

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的索引列。

1 个答案:

答案 0 :(得分:0)

编写查询的方式非常不合适,因为它会强制评估表中每行的in子句。如果rTable中有许多符合条件的记录(让我们说1000),则restaurant_rate中的每一行都需要与1000个值进行比较才能被{{接受或拒绝1}}条件。

我会像这样重写你的查询:

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的{​​{1}}没有多大意义;在limit之前添加order by子句。