执行左右连接的 MySQL 查询需要 15 分钟

Posted

技术标签:

【中文标题】执行左右连接的 MySQL 查询需要 15 分钟【英文标题】:MySQL query with left and right join taking 15 minutes to execute 【发布时间】:2013-07-30 11:57:52 【问题描述】:

我们有一个旧系统,它显示保存在数据库中的新闻源。它之前运行良好,完全没有问题。但是,现在查询不起作用,完成查询需要超过 15 分钟。为了测试,我尝试了许多优化查询的方法。然而,没有运气。如果有人可以提出一些建议,我将不胜感激。当前数据库没有任何索引。如果有人认为我应该创建索引。请让我知道哪些表和索引应该是什么。我对索引知之甚少。请找到我正在运行的查询以及 ERD。

select *, DATEDIFF(Now(), Date) as Day, DATE_ADD(Date, INTERVAL 1 MONTH) as Diff from users
left join users_propertyvalues UPV USING(UserId)
left join propertyvalues PV USING(ValueId)
right join item_categories IC ON (IC.CategoryId=UPV.ValueId)
left join newsfeed USING(ItemId)
left join rss_feeds F ON(PV.ValueId=F.FeedId)
where EmailEnabled
having NOW() <= Diff
order by UserId, CategoryId, Date DESC

堆栈溢出不允许我上传 ERD 图片。请让我知道是否有人想要我可以将其上传到某个地方。

感谢您的帮助![在此处输入图片描述][1]

【问题讨论】:

where EmailEnabled ??? 【参考方案1】:

索引应该在“加入”列 + 为它们添加 PK...附加您可以添加 unique inedexes

添加 PK(它是主要的,唯一的):

`ALTER TABLE `test`     CHANGE `test` `test` INT(11) NOT NULL,    ADD PRIMARY KEY(`test`);`

添加索引(名称无关紧要):

ALTER TABLE `test` ADD UNIQUE `NewIndex1` (`test`);

查看信息http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html

【讨论】:

谢谢 jaczes。可以举个例子吗? 例如在加入left join users_propertyvalues UPV USING(UserId) 中应该有一个users.UserId 上的PK 和users_propertyvalues.UserId 上的索引。对于其他连接列,依此类推。此外,如果您确实有具有唯一值的字段,您可以添加这样的新索引 - 更好,因为 MYSQL 在第一个结果后停止搜索 感谢 jaczes。索引的名称应该是什么?名称重要还是必须与主键同名? Jaczes,你能给我一个你将如何创建索引的例子吗?只是sql语句。抱歉问太多了。非常感谢 Jaczes,非常感谢。我试图这样做“在th_users(UserId) INCLUDE (EmailEnabled, SmsEnabled) 上创建非集群索引用户 ID”

以上是关于执行左右连接的 MySQL 查询需要 15 分钟的主要内容,如果未能解决你的问题,请参考以下文章

对两个 MySQL 查询执行左外连接?

mysql左连接和右连接的区别

MySQL左右连接查询中的NULL的数据筛选问题

MySql:查询优化(多个左连接)

使用子查询改进 MySql 查询左外连接

为啥这个简单的左连接需要永远执行?