优化 ORDER BY 查询

2024-03-04

我不知所措。我有一个大约有 100K 行的表。查询该表时,结果通常很快,大约 2 毫秒左右。但每当我使用 ORDER BY 时,性能就会急剧下降到 120 毫秒左右。我读了MySQL ORDER BY 优化 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html页面,但我不能说我理解一切。尤其是索引我不清楚。

最终我想运行以下查询:

SELECT *
  FROM `affiliate_new_contracts`
 WHERE  phone_brand IN ('Apple','Blackberry','HTC','LG','Motorola','Nokia',
                        'Samsung','Sony Ericsson')
   AND contract_length IN ('12','24')
   AND (addon IS NULL OR addon IN('Telfort Sms 300','Surf & Mail'))
   AND (plan_name = 'Telfort 100'
        AND 
        credible_shop = 1
       ) 
  ORDER BY average_price_per_month ASC, phone_price_guestimate DESC,
           contract_length ASC;

但如果我理解基本原理,我会很高兴。
删除上一个查询中的 ORDER BY 子句使其运行时间为 20 毫秒,而不是 120 毫秒。我有一个索引average_price_per_month字段,但将 ORDER BY 子句简化为ORDER BY average_price_per_month没有带来任何性能提升。我不明白。我对所谓的多列索引也一无所知,它应该能够帮助我完成最终的查询。

任何帮助,将不胜感激。我该如何让这个坏男孩表现出色?或者说这个追求是乌托邦式的?

The CREATE TABLE语法如下:

$ show create table affiliate_new_contracts;
CREATE TABLE `affiliate_new_contracts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `plan_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `contract_length` int(11) DEFAULT NULL,
  `phone_brand` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `price` float DEFAULT NULL,
  `average_price_per_month` float DEFAULT NULL,
  `phone_price_guestimate` float DEFAULT NULL,
  `credible_shop` tinyint(1) DEFAULT '0',
  `addon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `addon_price` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_affiliate_new_contracts_on_plan_name` (`plan_name`),
  KEY `index_affiliate_new_contracts_on_average_price_per_month` (`average_price_per_month`),
  KEY `index_affiliate_new_contracts_on_price` (`price`)
) ENGINE=InnoDB AUTO_INCREMENT=2472311 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

顺便说一句,该表每周重新创建一次,同时不会更新。


对 ORDER BY 子句可以进行的优化程度是有限的。有时有帮助的主要方法是以正确的顺序在正确的列集上建立索引。因此,对于您的示例,(单个、复合)索引:

average_price_per_month ASC, phone_price_guestimate DESC, contract_length ASC

可能会有所帮助,但优化器可能仍然认为最好使用其他索引来处理查询中的过滤条件,然后它会对自己选择的数据进行排序。请注意,除非索引以完全正确的排序顺序提供数据并且使用索引总体上加快了查询速度,否则优化器将不会使用它。仅在要排序的一列上建立索引对于优化器来说好处有限,并且通常不会使用这样的索引。

需要考虑一个问题:

  • 如果没有 ORDER BY 子句,查询的执行速度有多快。

这可以让您非常直接地衡量分类成本。您提到没有排序的情况下为 20 毫秒,有排序的情况下为 120 毫秒,因此 ORDER BY 的成本适中。下一个问题可能是“你能在你的应用程序中超越同类吗?”。您也许能够做到这一点,但 DBMS 中的排序包通常经过相当好的优化,您可能需要努力工作才能击败它。

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

优化 ORDER BY 查询 的相关文章

随机推荐

  • 有效地将 {坐标+值} 集绘制到(numpy 数组)位图

    假设我有一组像素值 例如 gt S 42 6 2 0 1 0 0 这里第 42 个条目是像素位置 6 2 呈暗红色 如何高效绘图S进入一个新的 numpy 位图数组bitmap np zeros 1024 768 3 是否有一些矢量化解决方
  • Crypto-Js 与 mcrypt 的输出不同

    我有一个 js 脚本 它加密 Blade 数据 如果我加密它 它会返回输出 JS 脚本结果 uqnOrevjCc2YCvY3uKNjzA 现在 以此答案作为比较的基础 我编写了或者更确切地说 在 PHP 中搜索了与我的 JS 脚本类似的等效
  • 如何运行烧瓶应用程序?

    我想知道启动烧瓶应用程序的正确方法 该文档显示了两个不同的命令 flask a sample run and python3 4 sample py 产生相同的结果并正确运行应用程序 两者之间有什么区别 应该使用哪一个来运行 Flask 应
  • AWS EventBridge 使用自定义详细信息安排事件?

    我正在尝试构建一个架构 其中使用多个参数集按计划触发单个 Lambda 因此 例如 如果我有三组参数并将计划设置为十分钟 我希望每十分钟执行三次 有没有办法使用自定义属性触发 EventBridge 计划事件 以便我可以将参数传递给 Lam
  • 数据表中要删除的排序箭头

    需要帮助删除数据表标题行上的排序箭头 升序和降序 然后当用户单击标题列时 将出现升序箭头 当然数据将按升序排序 MyDataTable dataTable aoColumns bSortable false null
  • R通过R_LIBS设置库路径

    我已阅读 R 常见问题解答和其他帖子 但我有点困惑 并且很高兴知道我所做的一切是否正确 在Windows中 为了修改默认的库文件夹 我创建了一个文件Renviron site并放入里面E Programs R 3 3 0 etc 该文件只有
  • 如何在 VBA for Ms Access 中擦除或重新加载 InkPicture 笔画?

    我想显示之前在 Ms Access 中的 inkPicture 对象上保存的笔画 它位于通过 ActiveX 的表单上 笔划作为 ole 对象保存在表中的 笔划 字段中 现在 执行一次就足够简单了 一行代码 我可以毫无问题地使用此代码片段
  • 计算 pyspark 中的分组中位数

    使用 pyspark 时 我希望能够计算分组值与其中值之间的差异 这可能吗 这是我编写的一些代码 它可以执行我想要的操作 除了它计算平均值的分组差异之外 另外 如果您愿意提供帮助 请随时评论我如何做得更好 from pyspark impo
  • web.config 转换在构建服务器上不起作用

    我们正在与 Team City 建立持续集成 在签到的基础上进行构建 这工作正常 但是它总是使用默认的 web config 构建 它不会随着开发环境特定的 Web 配置进行转换 在 Visual Studio 中 我为开发创建了自定义构建
  • std::remove_if 和 std::isspace - 编译时错误

    我有以下代码 include
  • Python 属性描述符设计:为什么要复制而不是变异?

    我正在研究Python如何实现属性描述符 https docs python org 2 howto descriptor html properties内部 根据文档property 是根据描述符协议实现的 为了方便起见 在此处复制它 c
  • Qt - webkit - 如何以编程方式登录

    我正在制作一个网络爬虫 因为我需要以编程方式登录我的电子邮件帐户 谁能说一下如何实现这一目标 我认为 QNetworkAccesManager 和它的 get 可以做到这一点 但是 我不太清楚 请有人阐明这个问题 注意 我使用的是 Qt 4
  • 使用查询字符串参数消除 UriTemplate 匹配的歧义

    我正在使用 WCF 4 0 创建 REST ful Web 服务 我想做的是根据查询字符串参数调用不同的服务方法UriTemplate 例如 我有一个 API 允许用户使用驾驶执照或社会安全号码作为密钥来检索有关人员的信息 在我的Servi
  • 如何从用户计算机加载图像

    是否可以从用户计算机将图像加载到 XNA 游戏 例如 我想将 C Images Box png 加载到精灵纹理 是否可以 如果是 怎么办 在XNA 4 0中使用Texture2D FromStream http msdn microsoft
  • 使用 IIS 调试 ASP.NET

    我已经在 Visual Studio 2008 中将调试设置为 IIS 而不是内置服务器 这样我就可以在开发时运行 url 重写 使用 IIRF 花了一段时间才开始工作 更改权限 重新安装 NET 框架 但它正在工作 我关闭了机器 现在它重
  • 将 ClassPathScanningCandidateComponentProvider 与多个 jar 文件一起使用?

    我正在考虑使用 ClassPathScanningCandidateComponentProvider 在 JVM 中查找特定类的子类 我正在做的事情几乎完全按照这里描述的进行 在运行时扫描Java注释 https stackoverflo
  • Android 中双 SIM 卡设备的手机号码验证

    我已经在我的应用程序中完成了 SIM 手机号码验证 与 Whats APP 相同 部分 就像是 发送消息部分 SmsManager sm SmsManager getDefault sm sendTextMessage mobileNumb
  • 在sql server表中存储标签的最佳方式?

    存储记录标签的最佳方式是什么 只使用 varchar 字段 当选择包含标签 x 的行时怎么样 使用like运算符 thanks 取决于两件事 1 标签 标记记录的数量2 无论你是否对正常化有宗教观点 除非处理大量数据 否则我建议使用一个 标
  • 如何替换 ajax 加载的 html 文档上的元标题、关键字和描述?

    如何用 ajax 调用中传入的 html 文档中的元标题和描述替换文档上的元标题和描述 我正在从相邻 html 文档上的 content div 调用新内容 我想要发生的是 当新内容加载时 我想用正在加载的 html 文件中的元标题替换主文
  • 优化 ORDER BY 查询

    我不知所措 我有一个大约有 100K 行的表 查询该表时 结果通常很快 大约 2 毫秒左右 但每当我使用 ORDER BY 时 性能就会急剧下降到 120 毫秒左右 我读了MySQL ORDER BY 优化 http dev mysql c