MySQL为什么不使用最优索引

2023-12-13

我正在尝试优化我的查询,但是,MySQL 似乎在查询上使用了非最佳索引,我似乎无法弄清楚出了什么问题。我的查询如下:

SELECT  SQL_CALC_FOUND_ROWS deal_ID AS ID,dealTitle AS dealSaving,
       storeName AS title,deal_URL AS dealURL,dealDisclaimer,
       dealType, providerName,providerLogo AS providerIMG,createDate,
       latitude AS lat,longitude AS lng,'local' AS type,businessType,
       address1,city,dealOriginalPrice,NULL AS dealDiscountPercent,
       dealPrice,scoringBase, smallImage AS smallimage,largeImage AS image,
       storeURL AS storeAlias,
       exp(-power(greatest(0, 
             abs(69.0*DEGREES(ACOS(0.82835377099147 *
               COS(RADIANS(latitude)) * COS(RADIANS(-118.4-longitude)) +
               0.56020534635454*SIN(RADIANS(latitude)))))-2),
                       2)/(5.7707801635559)) *
            scoringBase * IF(submit_ID IN (18381),
               IF(businessType = 1,1.3,1.2),IF(submit_ID IN (54727),1.19, 1)
                          ) AS distance
    FROM  local_deals
    WHERE  latitude BETWEEN 33.345362318841 AND 34.794637681159
      AND  longitude BETWEEN -119.61862872928 AND -117.18137127072
      AND  state = 'CA'
      AND  country = 'US'
    ORDER BY  distance DESC
    LIMIT  48 OFFSET 0; 

列出表上的索引显示:

+-------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table       | Non_unique | Key_name        | Seq_in_index | Column_name     | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| local_deals |          0 | PRIMARY         |            1 | id              | A         |      193893 |     NULL | NULL   |      | BTREE      |         |               |
| local_deals |          0 | unique_deal_ID  |            1 | deal_ID         | A         |      193893 |     NULL | NULL   |      | BTREE      |         |               |
| local_deals |          1 | deal_ID         |            1 | deal_ID         | A         |      193893 |     NULL | NULL   |      | BTREE      |         |               |
| local_deals |          1 | store_ID        |            1 | store_ID        | A         |      193893 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | storeOnline_ID  |            1 | storeOnline_ID  | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | storeChain_ID   |            1 | storeChain_ID   | A         |         117 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | userProvider_ID |            1 | userProvider_ID | A         |           5 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | expirationDate  |            1 | expirationDate  | A         |        3127 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | createDate      |            1 | createDate      | A         |       96946 |     NULL | NULL   | YES  | BTREE      |         |               | 
| local_deals |          1 | city            |            1 | city            | A         |       17626 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | state           |            1 | state           | A         |         138 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | zip             |            1 | zip             | A         |       38778 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | country         |            1 | country         | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | latitude        |            1 | latitude        | A         |      193893 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | longitude       |            1 | longitude       | A         |      193893 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | eventDate       |            1 | eventDate       | A         |        4215 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | isNowDeal       |            1 | isNowDeal       | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | businessType    |            1 | businessType    | A         |           5 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | dealType        |            1 | dealType        | A         |           5 |     NULL | NULL   | YES  | BTREE      |         |               |
| local_deals |          1 | submit_ID       |            1 | submit_ID       | A         |           5 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

运行解释扩展显示:

+------+-------------+-------------+------+----------------------------------+-------+---------+-------+-------+----------+----------------------------------------------------+
| id   | select_type | table       | type | possible_keys                    | key   | key_len | ref   | rows  | filtered | Extra                                              |
+------+-------------+-------------+------+----------------------------------+-------+---------+-------+-------+----------+----------------------------------------------------+
|    1 | SIMPLE      | local_deals | ref  | state,country,latitude,longitude | state | 35      | const | 52472 |   100.00 | Using index condition; Using where; Using filesort |
+------+-------------+-------------+------+----------------------------------+-------+---------+-------+-------+----------+----------------------------------------------------+

表中有大约 200k 行。奇怪的是,它忽略了纬度和经度索引,因为这些索引应该更多地过滤表。运行一个查询,其中我删除了“州”和“国家”,其中命令显示以下解释:

+------+-------------+-------------+-------+--------------------+-----------+---------+------+-------+----------+----------------------------------------------------+
| id   | select_type | table       | type  | possible_keys      | key       | key_len | ref  | rows  | filtered | Extra                                              |
+------+-------------+-------------+-------+--------------------+-----------+---------+------+-------+----------+----------------------------------------------------+
|    1 | SIMPLE      | local_deals | range | latitude,longitude | longitude | 5       | NULL | 30662 |   100.00 | Using index condition; Using where; Using filesort |
+------+-------------+-------------+-------+--------------------+-----------+---------+------+-------+----------+----------------------------------------------------+

这表明经度索引可以更好地将表过滤到 30,662 行。我在这里错过了什么吗?我怎样才能让MySQL使用所有查询。请注意,该表是 InnoDB,我使用的是 MySQL 5.5。


最适合您的查询的索引是复合索引(country, state, latitude, longitude) (country and state可以互换)。 MySQL 有关于多列索引的很好的文档,这是here.

基本上,latitude and longitude个人并没有特别选择性。不幸的是,标准 B 树索引仅支持一种不等式,而您的查询有两种。

实际上,如果你想要GIS处理,那么你应该使用MySQL的空间扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL为什么不使用最优索引 的相关文章

随机推荐

  • 使用 /proc/meminfo 读取 Android 设备的 RAM 总量

    我正在考虑读取 Android 设备的物理 RAM 总量 据我了解 这些信息存储在 proc meminfo中 我怎样才能阅读它 尝试这个 public void getTotalMemory String str1 proc meminf
  • 如何循环返回主菜单?

    我想知道这是否是循环回到 python 主菜单的正确方法 选择选项并完成任务后 脚本需要返回主菜单而不是退出 usr bin python def mainmenu print 1 Scan print 2 Ping print 3 Exi
  • 是否可以在 POST Json 中附加文件?

    我有一堆 JSON 序列化对象 格式的数据 我通过以下方式将此数据发送到服务器POST带标题的方法 Content Type application json 是否可以将文件附加到正文请求并立即发送 或者 JSON 数据建议仅发送文本数据
  • AttachConsole 错误 5:访问被拒绝

    我正在 Visual Studio 2013 中使用 C 控制台应用程序 在 Windows 上工作 首先我使用分离控制台FreeConsole 有用 然后 调用AllocConsole as FreeConsole 然后 AttachCo
  • 在字符列上合并大型 data.tables 会导致段错误

    我正在使用 R 版本 3 3 3 尽管我已经在 3 4 0 上复制了这个问题 并且data tableCygwin 上的版本 1 10 4 Edit 下面的评论表明这可能是 Cygwin 特有的 我需要通过字母数字 ID 列合并两个数据表
  • 为什么 jhat 的 -baseline 选项不起作用?

    为什么每个对象似乎都被标记为新对象 而不仅仅是第二个快照中但不在我的基准快照中的对象 在网上查看 我看到一些建议 我需要使用 hprof 而不是 jmap 来进行内存转储 但 hprof 似乎以完全相同的格式生成转储 这是JDK 1 6 0
  • 设置 PHP ImageMagick tmp 目录

    我正在尝试设置 ImageMagick 用于转换文件的临时目录 目前 在转换大型 PDF 时 临时文件夹很快就会达到 2 或 3 TB 这对于服务器磁盘来说太大了 因此我计划使用 AWS EFS 来存储所有内容 我将 EFS 驱动器安装在
  • 绘制隐式方程[重复]

    这个问题在这里已经有答案了 我需要在Python3中画一些曲线 我很习惯matplotlib pyplot 但我以前从未画过这样的东西 我真的很感激一些提示 特别是如何以 整洁 的方式编码的提示 和帮助 有一个例子 让我们用一颗心 x 2
  • Wix:升级时 Windows 服务有时会被卸载

    我们使用 Wix 安装我们的软件 我们的设置还安装了 Windows 服务 为了允许用户更改 Windows 服务的登录信息 我们只想在首次安装时安装该服务 并仅在卸载时将其删除 对于升级 我们手动停止服务 以便可以升级文件 我们已经做到了
  • MIPS 上的多精度算法

    我只是想在本机 MIPS 上实现多精度算术 假使 假设 一个 64 位整数位于寄存器 12 和 13 中 另一个 64 位整数位于寄存器 14 和 15 中 总和将被放置在寄存器 10 和 11 中 64 位整数的最高有效字位于偶数寄存器中
  • JSON.stringify 的逆向?

    我正在用 stringyfing 一个像这样的物体 foo bar 如何将字符串转回对象 你需要JSON parse 您的有效 JSON 字符串 var str hello world try var obj JSON parse str
  • 他们是如何在 http://artofflightmovie.com/ 中实现这些效果的?

    我一直试图了解他们是如何实现这些效果的http artofflightmovie com 到目前为止还没有成功 我什至不知道该通过谷歌搜索什么来寻求帮助 任何人都可以详细说明它 并可能放置指向插件 教程 其他网站做同样事情的链接吗 已经有一
  • 从 Python 中的命名空间对象导入变量

    假设我有一个命名空间args我通过调用获得的parser parse args 它解析命令行参数 如何将此命名空间中的所有变量导入到当前命名空间 e g parser add argument p some parameter defaul
  • 派生的 C++ 类如何通过基指针克隆自身?

    这就是我想要做的 此代码不起作用 class Base virtual Base clone return new Base this virtual void ID printf BASE class Derived publc Base
  • 用于打开 MSG 文件的 C# Outlook 互操作和 OpenSharedItem [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 为了使用 OpenSharedItem Outlook 互操作方法 我可以遵循任何教程或资源吗 我的目标是使用它读取 MSG 文件 因为它可以显然
  • Gradle 同步失败找不到约束布局:1.0.0-alpha2

    问题 Error Could not find com android support constraint constraint layout 1 0 0 alpha2 Required by myapp app unspecified
  • 将Mysql查询结果导出到Excel?

    我的要求是存储查询的整个结果 SELECT FROM document WHERE documentid IN SELECT FROM TaskResult WHERE taskResult 2429 到 Excel 文件 实现此目的的典型
  • 从精灵表中以 sfml 动画精灵

    我正在尝试在 sfml 中为精灵制作动画 目前 我可以移动精灵并在向不同方向移动时更改其图像 但我想在它移动时为其设置动画 我认为可能有一种方法可以使用 sf Clock 来完成此操作 或者可能有更好的方法 所有精灵都在同一个精灵表上 因此
  • do-while 无限循环 cout,忽略 cin

    该程序打印指定范围内指定数量的数字 但是 当我输入一个字符时 它只会无限循环我在其中执行的 do while 循环 例如 如果我在 输入最大数字 cin 中输入一个字符 它只会无休止地发送垃圾邮件 输入最大数字 它只是跳过cin 并循环 c
  • MySQL为什么不使用最优索引

    我正在尝试优化我的查询 但是 MySQL 似乎在查询上使用了非最佳索引 我似乎无法弄清楚出了什么问题 我的查询如下 SELECT SQL CALC FOUND ROWS deal ID AS ID dealTitle AS dealSavi