我有一个select查询,其中包含许多条件变量,所有条件变量都被索引,第二个查询条件变量较少。主要的有条件的是** XX **中的那些,其余的是可选的。你能建议哪一个可以更快更好地查询。
我只需要知道传递更多可选的索引条件变量是否更好。
1) SELECT *
FROM tableX
WHERE city_id = :city_id
AND category_id = :category_id
AND type_id = :type_id
AND **valid_date** > :date_now
AND (**N_lat** BETWEEN :sw_lat AND :ne_lat )
AND (**E_lng** BETWEEN :sw_lng AND :ne_lng )
AND (**price_deposit** BETWEEN :min_deposit AND :max_deposit )
AND (**price_rent** BETWEEN :min_rent AND :max_rent )
ORDER BY $colomnX DESC
2) SELECT *
FROM tableX
WHERE **valid_date** > :date_now
AND (**N_lat** BETWEEN :sw_lat AND :ne_lat )
AND (**E_lng** BETWEEN :sw_lng AND :ne_lng )
AND (**price_deposit** BETWEEN :min_deposit AND :max_deposit )
AND (**price_rent** BETWEEN :min_rent AND :max_rent )
ORDER BY $colomnX DESC
答案 0 :(得分:2)
查询1:这是最佳索引:
INDEX(city_id, category_id, type_id, one-more-thing)
前三个字段可以按任意顺序排列,第四个字段可以是“范围”测试的任何其他字段。
查询2:这些中的任何一个都可能是有益的:
INDEX(any-one-of-the-columns-mentioned-in-WHERE)
INDEX($columnX)
至于哪个列要索引,好吧,很难预测。您可以为每个索引创建单列索引,并让优化程序动态选择。
提及“范围”测试中的两列几乎从不在索引中使用。优化器可以使用第一个,但不会使用第二个。
查询2可能会提供比查询1更多的行,因此比较它们没有意义。
my cookbook中的更多讨论。