这是我在stackoverflow中的第一个问题,通常我习惯于在互联网上搜索答案,但这次我找不到这个问题的任何答案。
只是我的问题是查询需要太长时间才能执行,而它是 2 个表之间的简单连接
我将首先发布我的查询,然后我将发布有关我的系统的更多详细信息:
SELECT * FROM tbl_item
LEFT JOIN (SELECT * FROM tbl_item_details) AS tbl_item_details
ON tbl_item.item_id = tbl_item_details.item_details_item_id
WHERE item_active = 1 ORDER BY item_views DESC LIMIT 0,5
这是我的表结构:
CREATE TABLE `tbl_item` (
`item_id` int(11) NOT NULL AUTO_INCREMENT,
`item_views` int(11) NOT NULL,
`item_active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=821 DEFAULT CHARSET=utf8
tbl_item_details:
CREATE TABLE `tbl_item_details` (
`item_details_id` int(11) NOT NULL AUTO_INCREMENT,
`item_details_title` varchar(255) NOT NULL,
`item_details_content` longtext NOT NULL,
`item_details_item_id` int(11) NOT NULL,
PRIMARY KEY (`item_details_id`),
KEY `itm_dt_itm_id` (`item_details_item_id`),
CONSTRAINT `tbl_item_details_ibfk_1` FOREIGN KEY (`itm_dt_itm_id`) REFERENCES `tbl_item` (`itm_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=364 DEFAULT CHARSET=utf8
这是 EXPLAIN 查询输出:
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY tbl_item ALL NULL NULL NULL NULL 358 使用 where;使用临时的;使用文件排序 1 主要 全部 NULL NULL NULL NULL 358 2 衍生 tbl_item_details 全部 NULL NULL NULL NULL 422
每个表只有 350 行,而大表 (tbl_item_details) 为 1.5 MB,因此您会看到这些表非常小。
基本上,上述查询在以下系统上执行大约需要 4 秒:
CPU:Intel(R) Pentium(R) 4 CPU 3.20GHz(2 个 CPU),~3.2GHz RAM:3 GB Mysql:5.1.33(包含在 wamp 中)
之前,任何人都建议这里的解决方案是我尝试过的,有效的和无效的:
有效的事情并且查询花费了更少的时间(0.06秒):
- 我尝试删除 ORDER BY 我尝试从中删除 item_details_content
- 我尝试使用 INNER JOIN 的选择,它有效,我试过了
- 切换连接中的表,使 INNER 表变为 OUTER,反之亦然
我不能使用 INNER JOIN 因为 tbl_item 中可能有行在 tbl_item_details 中没有匹配项,我想要这些记录
我尝试过但不起作用的事情:
- 我尝试向 item_views 添加索引(不起作用)
- 我尝试删除外键约束
- 我尝试将表格引擎切换到 MyIsam
显然,当 mysql 对 item_details_content 中的日期和面对(相对)大数据进行排序时,就会出现问题,因此,如果我们摆脱其中一件事(排序或 item_details_content 列),它就可以正常工作。
但问题是,这不应该发生!因为该表的数据非常小,考虑到它只有 350 行,总共 1.5 MB!mysql 应该能够处理比这更多的数据。
请在建议对查询结构进行重大更改之前,恐怕这是不可能的,因为我已经在这个框架上工作了一段时间并且查询是动态生成的,对查询的更改可能意味着几天的工作但是您的建议总是受欢迎的。
PS:我在一个强大的服务器(核心 i7 和 8 GB RAM)上尝试了这个查询,它花了 0.3 秒,这对于这样的数据库来说仍然太长了
太感谢了