一个简单的左外链接。查询很慢。麻烦看一下为啥加上索引不对

lileltp 2018-02-12 12:03:27
表结构如下
CREATE TABLE `t_event_share_read` (
`id` varchar(36) NOT NULL COMMENT ,
`eventId` varchar(36) DEFAULT NULL COMMENT ,
`agentId` varchar(36) DEFAULT NULL COMMENT ,
`fDate` datetime DEFAULT NULL COMMENT ,
`ftype` varchar(36) DEFAULT NULL COMMENT ,
`source` varchar(36) DEFAULT NULL COMMENT ,
`orgCode` varchar(255) DEFAULT NULL COMMENT ,
PRIMARY KEY (`id`),
KEY `agentId` (`agentId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_agent` (
`userid` varchar(64) NOT NULL COMMENT ,
`mobileid` varchar(32) NOT NULL COMMENT ,
`state` int(4) NOT NULL DEFAULT '1' COMMENT ,
`level` varchar(32) DEFAULT NULL COMMENT ,
`validcommission` decimal(32,2) DEFAULT '0.00' COMMENT ,
`pickUpCommission` decimal(11,2) DEFAULT '0.00' COMMENT ,
`applyCommission` decimal(11,2) DEFAULT '0.00' COMMENT ,
`settleCommission` decimal(11,2) DEFAULT '0.00' COMMENT ,
`noSettleCommission` decimal(11,2) DEFAULT '0.00' COMMENT ,
`checkCode` varchar(200) DEFAULT NULL COMMENT ,
`create_date` datetime DEFAULT NULL COMMENT ,
`update_date` datetime DEFAULT NULL COMMENT ,
`create_by` varchar(50) DEFAULT NULL COMMENT ,
`create_name` varchar(50) DEFAULT NULL COMMENT ,
`sys_company_code` varchar(50) DEFAULT NULL COMMENT ,
`update_by` varchar(50) DEFAULT NULL COMMENT ,
`sys_org_code` varchar(50) DEFAULT NULL COMMENT ,
`bpm_status` varchar(32) DEFAULT '1' COMMENT ,
`update_name` varchar(50) DEFAULT NULL COMMENT ,
`payType` varchar(36) DEFAULT NULL COMMENT ,
`isManual` varchar(36) DEFAULT '1' COMMENT ,
`orgCode` varchar(36) DEFAULT NULL COMMENT ,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

explain SELECT * FROM t_event_share_read AS A left JOIN t_agent AS B ON A.agentId=B.userid
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE A ALL NULL NULL NULL NULL 5280 NULL
1 SIMPLE B ALL NULL NULL NULL NULL 18968 Using where; Using join buffer (Block Nested Loop)

show index from t_event_share_read
t_event_share_read 0 PRIMARY 1 id A 5280 NULL NULL BTREE
t_event_share_read 1 agentId 1 agentId A 5280 NULL NULL YES BTREE
show index from t_agent
t_agent 0 PRIMARY 1 userid A 18968 NULL NULL BTREE
...全文
1017 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tomcat_x 2019-07-24
  • 打赏
  • 举报
回复
你两张表的编码格式都不一样,怎么可能会走索引呀。。。。。
zjcxc 2018-02-12
  • 打赏
  • 举报
回复
数据类型不一样,所以无法索引 agentId` varchar(36) `userid` varchar(64)
Rotel-刘志东 2018-02-12
  • 打赏
  • 举报
回复
添加索引字段数据类型一致这是一要方面,还要结合具体的业务场景,建立索引字段基数
Rotel-刘志东 2018-02-12
  • 打赏
  • 举报
回复
explain...贴出具体的执行计划,以供分析。
zjcxc 2018-02-12
  • 打赏
  • 举报
回复
另外,如果你改了表结构类型不一到的字段为一致,则重新提供一下执行计划
zjcxc 2018-02-12
  • 打赏
  • 举报
回复
show create table t_agent 看一下 至少从你这个执行计划是很有毛病的,按照你表结构 PRIMARY KEY (`userid`) 那么对于 left JOIN t_agent AS B ON A.agentId=B.userid 来说,因为 B.userid 是主键,它是唯一的,在执行计划中,第2行的 Rows 应该是 1 才对,你的计划执行是 18968 所以如果你的字段类型一一致,给出的表结构也没有问题的话,这个执行计划就显得诡异了
lileltp 2018-02-12
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
数据类型不一样,所以无法索引 agentId` varchar(36) `userid` varchar(64)
好像不是这个原因。我改成一样的也不行

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧