【发布时间】:2017-09-13 09:33:00
【问题描述】:
select mt.from_user, mt.to_user, mt.group_id, g.name, g.created_by as adminuser,
msg.*,
(
SELECT id
from messages
where t.thread_id = thread_id
and id NOT IN (
SELECT message_id from message_deleted
where user_id=275 and status='deleted' )
order by CreatedDate DESC
limit 1
) as msgid,
(
SELECT CreatedDate
from messages
where t.thread_id = thread_id
and id NOT IN (
SELECT message_id from message_deleted
where user_id=275 and status='deleted' )
order by CreatedDate DESC
limit 1
) as msgDate
from user_thread as t
left join message_thread as mt ON t.thread_id = mt.id
left join group_master as g ON mt.group_id = g.id
left join group_member as gm ON gm.group_id = g.id
left join messages as msg ON t.thread_id = msg.thread_id
where ( gm.user_id=275
or msg.from_id=275
or msg.to_id=275
)
and t.status = 'Active'
group by mt.id
order by msgDate DESC
这大约需要 50 秒。
在上面的代码中,我尝试拆分上面的查询并注意下面的子查询需要太多时间来执行。我可以将子查询转换为联接吗?请帮我。我被卡住了。请注意,所有连接的表都是必需的。
(
SELECT id
from messages
where t.thread_id = thread_id
and id NOT IN (
SELECT message_id from message_deleted
where user_id=275 and status='deleted' )
order by CreatedDate DESC
limit 1
) as msgid,
(
SELECT CreatedDate
from messages
where t.thread_id = thread_id
and id NOT IN (
SELECT message_id from message_deleted
where user_id=275 and status='deleted' )
order by CreatedDate DESC
limit 1
) as msgDate
【问题讨论】:
-
如果您没有找到解决方案,请考虑调整内存设置或硬件升级。 SSD 或 ramdisk 就像是加快速度的魅力。
-
子查询通常不会加快速度:-)。除此之外:分组行与那里无关,我实际上应该触发错误消息。因为您的查询中没有像 count() 或 sum() 这样的聚合函数
-
你试图通过这些子查询检索什么?
-
或许可以试试把这个放到
Code Review -
欢迎来到 Stack Overflow。请每个问题只问一个问题。您的 codeigniter 问题是您的第二个问题。请阅读这个。 meta.stackoverflow.com/a/271056 并特别注意第二个查询性能。请edit您的问题添加必要的详细信息。
标签: php mysql codeigniter query-performance