mysql order by 查询慢_mysql查询性能问题,加了order by速度慢了差不多50倍

基本情况:

数据表差不多有一千万条数据,用的是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的结果是:

dab00dd764066e628352733b93a90869.png

然后是加了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结果如下,65657fc18e36bd9b3ab6c43517fb59fc.png

看情况是加了order by导致where条件的索引没有使用而使用了主键扫描

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值