我有一个选择查询,其中一个查询有许多条件变量,并且所有条件变量都已索引,第二个查询的索引条件变量较少。主要条件为**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
最佳答案
查询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 .
关于mysql select性能(带索引的多变量与带索引的少变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525691/