order by id desc mysql 慢_mysql查询性能问题,加了order by速度慢了差不多50倍
基本情况:数据表差不多有一千万条数据,用的是mycat分库。数据表的里的索引有PRIMARYidAppName (AppName, custidStatus, channel)建表语句如下CREATE TABLE `eis_email_history` (`id` bigint(20) NOT NULL DEFAULT '0',`AppName` int(11) NOT NULL DEFAUL..
基本情况:
数据表差不多有一千万条数据,用的是mycat分库。
数据表的里的索引有
PRIMARY id
AppName (AppName, custidStatus, channel)
建表语句如下
CREATE TABLE `eis_email_history` (
`id` bigint(20) NOT NULL DEFAULT '0',
`AppName` int(11) NOT NULL DEFAULT '0',
`emailto` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '收件人email',
`emailfrom` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '寄件人email',
`subject` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '邮件标题',
`content` text COLLATE utf8_unicode_ci NOT NULL COMMENT '邮件内容',
`sendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送邮件的unixtime',
`sendstatus` tinyint(4) NOT NULL DEFAULT '0' COMMENT '发件状态,0:发送队列中,1:已发送,2:发送失败,3:预制邮箱记录的邮箱暂时不可用',
`channel` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '来源渠道',
`AmazonOrderId` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '???',
`ASIN` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT 'asin',
`attachment` text COLLATE utf8_unicode_ci COMMENT '邮件附件,格式为,有多个附件的要分行记录,每行2个参数(以“tab制表符”+“/”+“tab制表符”分隔),第一个参数必选,为文件所在服务器路径,第二个参数为可选,如果输入第二个参数,那么附件名即为第二参数,否则就已文件本身名称为附件名',
`templateId` bigint(20) NOT NULL DEFAULT '0' COMMENT '模板Id',
`custidStatus` int(20) NOT NULL DEFAULT '0' COMMENT '差评Id',
PRIMARY KEY (`id`),
KEY `emailto` (`emailto`(255)),
KEY `sendtime` (`sendtime`),
KEY `sendstatus` (`sendstatus`),
KEY `emailfrom` (`emailfrom`(255)),
KEY `asin` (`ASIN`),
KEY `orderid` (`AmazonOrderId`),
KEY `AppName` (`AppName`,`custidStatus`,`channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
首先是没有加order by的
SELECT
`id`,
`emailto`,
`channel`,
`AppName`,
`AmazonOrderId`
FROM
`eis_email_history`
WHERE `AppName` = 21
AND `custidStatus` IN (0, 1, 2)
AND `channel` = '***'
LIMIT 50
这个查询基本都是秒查询,然后explain的结果是:

然后是加了order by id desc的,
SELECT
`id`,
`emailto`,
`channel`,
`AppName`,
`AmazonOrderId`
FROM
`eis_email_history`
WHERE `AppName` = 21
AND `custidStatus` IN (0, 1, 2)
AND `channel` = '***'
ORDER BY id DESC
LIMIT 50
然后这个查询基本都在1分钟以上,explain结果如下,
看情况是加了order by导致where条件的索引没有使用而使用了主键扫描
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)