【问题标题】:mysql select performance (many variables with index vs less vaiables with index)mysql 选择性能(索引变量多与索引变量少)
【发布时间】:2015-09-11 14:19:40
【问题描述】:

我有一个选择查询,其中一个有许多条件变量,并且都被索引,第二个有更少的索引条件变量。主要的条件是** 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

【问题讨论】:

  • 更多的条件=更多的比较,会吃掉更多的cpu。你无法解决这个问题。另一方面,实际从存储中获取匹配记录的成本可能超过比较的成本,因此通过尽早消除更多记录来减少获取需求会有所帮助。但总的来说,我们没有办法回答这个问题。这完全取决于您的索引结构以及您的数据库的执行方式。
  • 谢谢,我会考虑通过消除更多可选变量来减少索引以节省更多CPU,但我不确定这是否会导致mysql通过减少条件来读取更多记录?

标签: mysql performance variables select indexing


【解决方案1】:

查询 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多