mysql select性能(带索引的多变量与带索引的少变量)

标签 mysql performance variables select indexing

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

相关文章:

python-3.x - 有效删除 Python 中的连续对重复项?

php - 从 PHP 调用 MySql 存储过程显示错误

php - 如何使用 %s 在 mysql 中使用 'like' 代码查询搜索

php - 如何检查查询确认

java - 使用 Spring MVC 在模型中添加多个属性会导致性能问题吗?

java - Web 服务操作中的变量未更新

mysql - 交叉连接无法正常工作

sql - 带日期时间的 WHERE 子句的索引等

C++ 为一个字符设置值**

.net - 在 VB.NET 中将变量声明为 Byte 时出现的问题