热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【mysql】mysql查询性能问题,加了orderby速度慢了差不多50倍

基本情况:数据表差不多有一千万条数据,用的是mycat分库。数据表的里的索引有PRIMARYidAppName(AppName,custidStatus,channel)建表语句如

主要介绍了两个方法:

  • 第一个是FORCE INDEX (PRIMARY):这个理解很直白就是强行加索引
  • 第二个是late row lookups,也就是文章的重点,其实就是先构造一个只有id的子查询,然后再join一起。这样极大的提高效率。如下示例代码,o是通过你的表和只有id查询出来的临时字表,l是要join一起包含所有字段的表。

SELECT xx,xxx,....

FROM (

SELECT id

FROM <你的表>

ORDER BY

id

LIMIT <返回条数的范围>

) o

JOIN <你的表> l

ON l.id = o.id

ORDER BY

l.id

把范围查询放在最后;

索引:
AppName (AppName, channel, custidStatus)

SELECT

`id`,

`emailto`,

`channel`,

`AppName`,

`AmazonOrderId`

FROM

`eis_email_history`

WHERE `AppName` = 21

AND `channel` = '***'

AND `custidStatus` IN (0, 1, 2)

ORDER BY id DESC

LIMIT 50

排序也是遵循索引顺序的,所以索引顺序是至关重要的一部分。
【mysql】mysql查询性能问题,加了order by速度慢了差不多50倍

是可以的,不过我发现你的主键是没有自增的,你可以检查下是否有受主键 ID 的一个影响,又或者 mysql 的版本影响。我所使用的 mysql 版本为 5.5.53

编辑一下我的答案,晚上回来查了一下《高性能mysql》。我的答案如下:将索引改为

AppName (id, AppName, custidStatus, channel)

order by 子句需要索引的列顺序需要满足索引的最左前缀的要求,所以ID需要排在第一。

有一种情况下order by子句可以不满足索引的最左前缀的要求,就是前导列为常量的时候。但是查询的where

WHERE `AppName` = 21

AND `custidStatus` IN (0, 1, 2)

AND `channel` = '***'

)

custidStatus列中有多个等于条件,对于排序来说,这也是一种范围查询,所以不满足最左前缀的要求。所以下面的索引是错误的。

AppName (AppName, custidStatus, channel,id)

PS:这是晚上专门查书看的资料,有疑问或者觉得我错误的可以再讨论一下?

explain

SELECT

`id`

FROM

`eis_email_history`

WHERE

`AppName` = 21

AND `custidStatus` IN (0, 1, 2)

AND `channel` = '***'

ORDER BY

`id`

LIMIT 50

这个执行看下?

分享下 https://segmentfault.com/a/11...


推荐阅读
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文主要介绍了MySQL中子查询的基本用法和三种用法,包括生成参考值、内层查询与外层查询的比较操作以及使用事件号在成绩表中找到学生的分数记录。通过详细解析子查询的实例,帮助读者更好地理解和应用子查询。 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 文件路径的生成及其在文件操作中的应用
    本文介绍了文件路径的生成方法及其在文件操作中的应用。在进行文件操作时,需要知道文件的具体位置才能打开文件。文件的位置有绝对路径和相对路径之分。绝对路径通常只在特定电脑上有效,不同电脑上的文件存放路径可能不同,导致程序报错。相对路径是解决这个问题的最好方式,它不依赖于文件的具体存放位置,只需要按照统一的规范进行文件存放即可。使用相对路径可以避免冗余和麻烦,特别适用于大项目和团队维护代码的情况。 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
author-avatar
白日星445533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有