gpt4 book ai didi

MySQL - 加速查询避免文件排序和临时

转载 作者:行者123 更新时间:2023-11-28 23:52:56 26 4
gpt4 key购买 nike

我的 MySQL 查询很慢。我有 3 个表:工作(20 万条记录)、位置(30 万条)、职位(70 万条)。

SELECT
j.job_offerid
FROM `job_offer` AS j
INNER JOIN `job_offer_localitymap` AS d ON d.`job_offerid` = j.`job_offerid` AND
`gps_localityid` IN(35, 3301, 3302, 3303, 3305, 3306, 3307, 3308, 124, 3811, 3805, 3709, 3808, 3809)
WHERE
j.`status` = 1 AND
j.`job_offerid` IN(
SELECT `job_offerid`
FROM `job_offer_positionmap`
WHERE `cb_job_positionid` IN (1001, 6, 629, 7, 8, 9, 10, 11, 12, 13, 1, 15, 16, 17))
ORDER BY j.`job_offerid` DESC
LIMIT 3

我必须过滤位置和地点,所以我使用了 IN。

解释:使用哪里;使用索引;使用临时的;使用文件排序;开始临时

仅使用行的表方案:

CREATE TABLE `job_offer` (
`job_offerid` int(13) NOT NULL AUTO_INCREMENT,
`status` int(13) NOT NULL DEFAULT '1',
PRIMARY KEY (`job_offerid`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `job_offer_localitymap` (
`job_offer_localitymapid` int(13) NOT NULL AUTO_INCREMENT,
`gps_localityid` int(13) NOT NULL,
`job_offerid` int(13) NOT NULL,
PRIMARY KEY (`job_offer_localitymapid`),
KEY `gps_localityid` (`gps_localityid`),
KEY `job_offerid` (`job_offerid`),
KEY `gps_localityid_job_offerid` (`gps_localityid`,`job_offerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `job_offer_positionmap` (
`job_offer_positionmapid` int(13) NOT NULL AUTO_INCREMENT,
`cb_job_positionid` int(13) NOT NULL,
`job_offerid` int(13) NOT NULL,
PRIMARY KEY (`job_offer_positionmapid`),
KEY `cb_job_positionid` (`cb_job_positionid`),
KEY `job_offerid` (`job_offerid`),
KEY `cb_job_positionid_job_offerid` (`cb_job_positionid`,`job_offerid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

索引无处不在。

谢谢你的建议

最佳答案

您的加入将从复合中受益

job_offer_localitymap.(job_offerid,gps_localityid)

也就是说,与您当前在该表中的组合相反。

因此你可以放弃这两个:

  KEY `gps_localityid` (`gps_localityid`),
KEY `job_offerid` (`job_offerid`),

然后你会留下两个复合索引,每个索引的最左边被其他查询使用,这些查询受益于上述两个我刚刚说过要删除


在您的查询行 5 中,保持一致并使用别名 j,因为我不得不寻找(时间不长)以查看哪个表


在我看来,job_offer 中的 KEY status (status) 可能相对没用,但我不知道您还有其他疑问。但是,由于您的数据类型很薄,job_offer(job_offerid,status) 上的组合可以让您的许多查询飞起来,因为它是一个不需要在数据页之后进行的覆盖索引


至于 job_offer_positionmap,这可能是一个移除缓慢子查询的连接,开发人员也可以选择在其中添加一个组合。该连接在概念上类似于第一个连接。


我发现 in 子句一般没有问题,因为 mysql CBO基于成本的优化器应该处理这个问题。


但这些只是建议,因为添加索引并非完全没有缺点。这是一个脆弱的平衡行为,但最终您可能会发现不仅这个查询成功了,您的其他查询也成功了。


关于MySQL - 加速查询避免文件排序和临时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32314987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com