mysql选择性能(许多带索引的变量vs带有索引的较少vaiables)

时间:2015-09-11 14:19:40

标签: mysql performance variables select indexing

我有一个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

1 个答案:

答案 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中的更多讨论。